博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 使用Shell32 进行压缩与解压缩的标准且正确做法
阅读量:6034 次
发布时间:2019-06-20

本文共 2974 字,大约阅读时间需要 9 分钟。

具体参见代码,就不再做其他相关说明了;这是用于上线产品中的源代码。

解压部分:

1         ///  2         /// 解压压缩包 3         ///  4         /// 压缩包的绝对路径 5         /// 解压到的文件夹路径 6         public static void UnZip(string zipPath, string dirPath) 7         { 8             // 判断ZIP文件是否存在 9             if (!System.IO.File.Exists(zipPath))10                 throw new FileNotFoundException();11 12             // 如果目标目录不存在就创建13             if (!Directory.Exists(dirPath))14                 Directory.CreateDirectory(dirPath);15 16             //Shell的类型17             Type shellAppType = Type.GetTypeFromProgID("Shell.Application");18 19             //创建Shell对象20             object shell = Activator.CreateInstance(shellAppType);21 22             // ZIP文件23             Shell32.Folder srcFile = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { zipPath });24 25             // 解压到的目录26             Shell32.Folder destFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { dirPath });27 28             // 遍历ZIP文件29             foreach (var file in srcFile.Items())30             {31                 destFolder.CopyHere(file, 4 | 16);32             }33         }

 

压缩部分:

1         ///  2         /// 压缩文件夹内的文件到zip文件中 3         ///  4         /// 需要压缩的目录绝对路径 5         /// 压缩后的绝对路径 6         public static void ZipDir(string dirPath, string zipPath) 7         { 8             // 不存在地址则创建 9             if (!System.IO.File.Exists(zipPath))10                 using (System.IO.File.Create(zipPath)) { };11 12             //Shell的类型13             Type shellAppType = Type.GetTypeFromProgID("Shell.Application");14 15             //创建Shell对象16             object shell = Activator.CreateInstance(shellAppType);17 18             // ZIP文件19             Shell32.Folder destFile = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { zipPath });20 21             // 源文件夹22             Shell32.Folder srcFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { dirPath });23 24             //已经压缩进去的文件25             int zipFileCount = 0;26 27             // 遍历并压缩源文件夹的文件到Zip中,因为压缩需要消耗时间需要进行等待28             foreach (var file in srcFolder.Items())29             {30                 destFile.CopyHere(file, 4 | 16);31                 zipFileCount++;32 33                 // 判断后进行等待34                 while (destFile.Items().Count < zipFileCount)35                 {36                     // 因为压缩需要消耗时间需要进行等待37                     System.Threading.Thread.Sleep(10);38                 }39             }40         }

需要引用的DLL

C:\Windows\System32\Shell32.dll 嵌入互操作类型为False

注意:CopyHere中的那个枚举参数建议使用代码中的值不需要做其它处理,其它参数值可参见 http://blog.csdn.net/wzhiu/article/details/18224725

转载于:https://www.cnblogs.com/meifeipeng/p/8340328.html

你可能感兴趣的文章
control.add()
查看>>
p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上
查看>>
GridView强制换行与自动换行
查看>>
51Nod 1003 阶乘后面0的数量(数学,思维题)
查看>>
Sublime text3中配置Github
查看>>
Getting Started with iOS Development Part10:Customizing your Mobile target's Splash screen
查看>>
asp.net C# MVC 提交表单后清空表单
查看>>
备份软件 FreeFileSync 怎么用
查看>>
Asp.net,C# 加密解密字符串
查看>>
网页视频播放器插件源码
查看>>
CentOS7 睡眠 休眠 关机 电源
查看>>
SqlServer里DateTime转字符串
查看>>
2019-4-23 plan
查看>>
固定弹层叉掉
查看>>
[编解码] 关于base64编码的原理及实现
查看>>
WinDbg配置和使用基础
查看>>
转:Object-Runtime的基本数据类型
查看>>
JMJS系统总结系列----Jquery分页扩展库(五)
查看>>
Excel技巧之——英文大小写转换(转)
查看>>
Google 翻译的妙用
查看>>