.NET 操作ZIP文件第三方库DotNetZip

以前c#中一直用ICSharpCode来操作Zip文件,最近碰到一点问题,找到一个更加灵活、高效的第三方库DotNetZip。
官方地址: http://dotnetzip.codeplex.com/
Github入口: https://github.com/eropple/dotnetzip
同时提供一个简单的例子,例子中没有做异常处理(ps:只需要引入Ionic.Zip.dll即可 ):
也可以参考这篇文章

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ionic.Zip;

namespace DiagramToolkit.Utils {
    /// <summary>
    /// 压缩操作相关操作类,压缩格式为ZIP
    /// </summary>
    public class Compress {
        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="targetFileName">目标文件名</param>
        /// <param name="sourceFileNames">源文件名</param>
        /// <returns>压缩包压缩是否成功</returns>
        public static bool ZipFile(string targetFileName, params string[] sourceFileNames) {
            bool result = true;

            try {
                using (ZipFile zip = new ZipFile(Encoding.Default)) {
                    foreach (string filename in sourceFileNames) {
                        ZipEntry e = zip.AddFile(filename, "");
                    }

                    zip.Save(targetFileName);
                }
            } catch (Exception) {
                result = false;
            }

            return result;
        }

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="targetFileName">目标文件名</param>
        /// <param name="sourceDirectory">源目录</param>
        /// <returns>压缩包压缩是否成功</returns>
        public static bool DoZipFile(string targetFileName, string sourceDirectory) {
            bool result = true;

            try {
                string[] sourceFileNames = Directory.GetFiles(sourceDirectory);
                using (ZipFile zip = new ZipFile(Encoding.Default)) {
                    foreach (string filename in sourceFileNames) {
                        ZipEntry e = zip.AddFile(filename, "");
                    }

                    zip.Save(targetFileName);
                }
            } catch (Exception) {
                result = false;
            }

            return result;
        }

        /// <summary>
        /// 解压zip文件
        /// </summary>
        /// <param name="targetDirectory">解压后目录</param>
        /// <param name="zipFileName">压缩包文件名</param>
        /// <returns>解压结果是否成功</returns>
        public static bool UnZipFile(string targetDirectory, string zipFileName) {
            bool result = true;

            try {
                using (ZipFile zip = new ZipFile(zipFileName)) {
                    zip.ExtractAll(targetDirectory);
                }
            } catch (Exception) {
                result = false;
            }

            return result;
        }

        /// <summary>
        /// 更新压缩包内容
        /// </summary>
        /// <param name="zipFileName">压缩文件名</param>
        /// <param name="sourceFileName">要更新的文件</param>
        public static void UpdateFileToZip(string zipFileName, string sourceFileName) {
            using (ZipFile zip = new ZipFile(zipFileName)) {
                string fileName = GetFileNameFromFullName(sourceFileName);
                if (zip.ContainsEntry(fileName)) {
                    var stream = File.OpenRead(sourceFileName);
                    var z = zip.UpdateEntry(fileName, stream);
                    z.Comment = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                }

                zip.Save();
            }
        }

        public static string ExtractSingleFile(string zipFileName, string fileName, string extractDirectoryPath="") {
            string tempFileName = "";
            if (string.IsNullOrEmpty(extractDirectoryPath)) {
                string temp = Environment.GetEnvironmentVariable("TEMP");
                DirectoryInfo info = new DirectoryInfo(temp);
                var tempInfo = info.CreateSubdirectory(Guid.NewGuid().ToString());
                extractDirectoryPath = tempInfo.FullName;
            }

            byte[] content = null;
            //转换stream为byte[]  
            Func<Stream, byte[]> toByteArray = (stream) => {
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);

                // 设置当前流的位置为流的开始   
                stream.Seek(0, SeekOrigin.Begin);
                return bytes;
            };

            using (ZipFile zip = new ZipFile(zipFileName, Encoding.Default)) {
                if (zip.ContainsEntry(fileName)) {
                    var entries = zip.Entries.Where(u => u.FileName.Equals(fileName));
                    if (entries == null || entries.Count() <= 0) {
                        return "";
                    }

                    var entry = entries.First();

                    //将文件解压到内存流  
                    using (var stream = new MemoryStream()) {
                        entry.Extract(stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        content = toByteArray(stream);
                    }
                }
            }

            //创建文件  
            tempFileName = Path.Combine(extractDirectoryPath, fileName);
            File.WriteAllBytes(tempFileName, content);

            return tempFileName;
        }

        /// <summary>
        /// 通过路径全名获取文件名
        /// </summary>
        /// <param name="fullFileName">全路井名</param>
        /// <returns>文件名</returns>
        private static string GetFileNameFromFullName(string fullFileName) {
            string fileName = fullFileName;
            int index = fullFileName.LastIndexOf('\\');
            if (index >= 0 && index < fullFileName.Length - 1) {
                fileName = fullFileName.Substring(index + 1);
            }

            return fileName;
        }
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值