我有一个包含 .ZIP文件的文件夹。现在,我想使用C#将ZIP文件解压缩到特定文件夹,但不使用任何外部程序集或.Net Framework 4.5。
我已搜索过,但未找到任何使用Framework 4.0或更低版本解压缩* .zip文件的解决方案。
我尝试过GZipStream,但它只支持.gz而不支持.zip文件。
答案 0 :(得分:30)
以下是msdn的示例。 System.IO.Compression.ZipFile
就是为此而做的:
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";
ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
}
}
}
编辑:抱歉,我错过了您对.NET 4.0及更低版本的兴趣。 必需的.NET framework 4.5及更高版本。
答案 1 :(得分:14)
我有同样的问题,发现了一篇非常简单的文章解决了这个问题。 http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/
你需要参考 COM库称为Microsoft Shell控件和自动化(Interop.Shell32.dll)
代码(从文章中未触及,只是让你看到它有多简单):
public static void UnZip(string zipFile, string folderPath)
{
if (!File.Exists(zipFile))
throw new FileNotFoundException();
if (!Directory.Exists(folderPath))
Directory.CreateDirectory(folderPath);
Shell32.Shell objShell = new Shell32.Shell();
Shell32.Folder destinationFolder = objShell.NameSpace(folderPath);
Shell32.Folder sourceFile = objShell.NameSpace(zipFile);
foreach (var file in sourceFile.Items())
{
destinationFolder.CopyHere(file, 4 | 16);
}
}
强烈推荐阅读这篇文章 - 他为旗帜4 | 16
带来了一次表达编辑:几年后我的应用程序运行了,我收到两个用户的投诉,突然之间应用程序停止了工作。 似乎CopyHere函数创建了临时文件/文件夹,但这些文件/文件夹从未被删除而导致出现问题。 可以在System.IO.Path.GetTempPath()。
中找到这些文件的位置答案 2 :(得分:1)
ZipPackage可能是一个开始的地方。它位于System.IO.Packaging内,可在.NET 4.0中使用
并不是上面提到的.NET 4.5方法的简单性,但看起来它可以做你想要的。
答案 3 :(得分:0)
.NET 3.5有一个DeflateStream。您必须为目录等信息创建结构,但PKWare已发布此信息。我编写了一个解压缩实用程序,一旦为它创建了结构,它就不会特别繁琐。
答案 4 :(得分:0)
我遇到了同样的问题并通过C#代码通过cmd shell调用7-zip可执行文件解决了这个问题,如下所示,
string zipped_path = "xxx.7z";
string unzipped_path = "yyy";
string arguments = "e " + zipped_path + " -o" + unzipped_path;
System.Diagnostics.Process process
= Launch_in_Shell("C:\\Program Files (x86)\\7-Zip\\","7z.exe", arguments);
if (!(process.ExitCode == 0))
throw new Exception("Unable to decompress file: " + zipped_path);
Launch_in_Shell(...)
定义为,
public static System.Diagnostics.Process Launch_in_Shell(string WorkingDirectory,
string FileName,
string Arguments)
{
System.Diagnostics.ProcessStartInfo processInfo
= new System.Diagnostics.ProcessStartInfo();
processInfo.WorkingDirectory = WorkingDirectory;
processInfo.FileName = FileName;
processInfo.Arguments = Arguments;
processInfo.UseShellExecute = true;
System.Diagnostics.Process process
= System.Diagnostics.Process.Start(processInfo);
return process;
}
缺点:你需要在你的机器上安装7zip,我只尝试使用“.7z”文件。希望这会有所帮助。
答案 5 :(得分:0)
您可以使用DotNetZip(开源) `
string zipFilePath = "C:\\sample.zip";
string extractedFilePath = "C:\\sampleFolder";
ZipFile zipfile = ZipFile.Read(zipFilePath);
if (!Directory.Exists(extractedFilePath))
Directory.CreateDirectory(extractedFilePath);
foreach (ZipEntry e in zipfile)
{
e.Extract(extractedFilePath,ExtractExistingFileAction.OverwriteSilently);
}`
答案 6 :(得分:-1)
在.net 4.0中,Deflate和GZip无法处理Zip文件,但您可以使用shell函数解压缩文件。
public FolderItems Extract()
{
var shell = new Shell();
var sf = shell.NameSpace(_zipFile.Path);
return sf.Items();
}
调用extract函数时,可以按
保存返回的folderItems FolderItems Fits = Extract();
foreach( var s in Fits)
{
shell.Namespace("TargetFolder").copyhere(s);
}