具体参见代码,就不再做其他相关说明了;这是用于上线产品中的源代码。
解压部分:
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