C# 解压压缩ZIP

.NET中zip的压缩和解压
https://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html

在.NET可以通过多种方式实现zip的压缩和解压:1、使用System.IO.Packaging;2、使用第三方类库;3、通过 System.IO.Compression 命名空间中新增的ZipArchive、ZipFile等类实现。…

参考:https://blog.csdn.net/y1535623813/article/details/88976332

在NET Framework 4.5框架中,原生System.IO.Compression.FileSystem.dll程序集中新增了一个名为ZipFile的类,,让压缩和解压zip文件变得更简单,ZipFile的使用示例如下:

System.IO.Compression.ZipFile.CreateFromDirectory(@"e:\test", @"e:\test\test.zip"); //压缩
System.IO.Compression.ZipFile.ExtractToDirectory(@"e:\test\test.zip", @"e:\test"); //解压

还有一种是使用shell32,进行zip包的解压与压缩。
引用DLL
C:\Windows\System32\Shell32.dll
有说,修改引用的属性“嵌入互操作类型”为False,但我默认没有修改,也可以。
注意:CopyHere中的那个枚举参数建议使用代码中的值不需要做其它处理,其它参数值可参见 http://blog.csdn.net/wzhiu/article/details/18224725

        /// <summary>
        /// 解压压缩包
        /// </summary>
        /// <param name="zipPath">压缩包的绝对路径</param>
        /// <param name="dirPath">解压到的文件夹路径</param>
        public static void UnZip(string zipPath, string dirPath)
        {
            // 判断ZIP文件是否存在
            if (!System.IO.File.Exists(zipPath))
                throw new FileNotFoundException();

            // 如果目标目录不存在就创建
            if (!Directory.Exists(dirPath))
                Directory.CreateDirectory(dirPath);

            //Shell的类型
            Type shellAppType = Type.GetTypeFromProgID("Shell.Application");

            //创建Shell对象
            object shell = Activator.CreateInstance(shellAppType);

            // ZIP文件
            Shell32.Folder srcFile = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { zipPath });

            // 解压到的目录
            Shell32.Folder destFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { dirPath });

            // 遍历ZIP文件
            foreach (var file in srcFile.Items())
            {
                destFolder.CopyHere(file, 4 | 16);
            }
        }

        /// <summary>
        /// 压缩文件夹内的文件到zip文件中
        /// </summary>
        /// <param name="dirPath">需要压缩的目录绝对路径</param>
        /// <param name="zipPath">压缩后的绝对路径</param>
        public static void ZipDir(string dirPath, string zipPath)
        {
            // 不存在地址则创建
            if (!System.IO.File.Exists(zipPath))
                using (System.IO.File.Create(zipPath)) { };

            //Shell的类型
            Type shellAppType = Type.GetTypeFromProgID("Shell.Application");

            //创建Shell对象
            object shell = Activator.CreateInstance(shellAppType);

            // ZIP文件
            Shell32.Folder destFile = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { zipPath });

            // 源文件夹
            Shell32.Folder srcFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { dirPath });

            //已经压缩进去的文件
            int zipFileCount = 0;

            // 遍历并压缩源文件夹的文件到Zip中,因为压缩需要消耗时间需要进行等待
            foreach (var file in srcFolder.Items())
            {
                destFile.CopyHere(file, 4 | 16);
                zipFileCount++;

                // 判断后进行等待
                while (destFile.Items().Count < zipFileCount)
                {
                    // 因为压缩需要消耗时间需要进行等待
                    System.Threading.Thread.Sleep(10);
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值