.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);
}
}
}