我正在尝试以编程方式解压缩压缩文件。

我尝试在.NET中使用System.IO.Compression.GZipStream类,但当我的应用程序运行时(实际上是一个单元测试),我得到这个异常:

System.IO.InvalidDataException: GZip头中的魔法数字不正确。确保你传递的是一个GZip流。

我现在意识到。Zip文件和。gz文件不一样,GZip和Zip也不一样。

然而,由于我能够通过手动双击压缩文件,然后单击“提取所有文件”按钮来提取文件,我认为在代码中也应该有一种方法来做到这一点。

因此,我尝试使用Process.Start(),并将压缩文件的路径作为输入。这导致我的应用程序打开一个窗口,显示压缩文件中的内容。这一切都很好,但应用程序将被安装在一个服务器上,没有人可以点击“提取所有文件”按钮。

那么,我如何让我的应用程序提取压缩文件中的文件?

或者还有别的办法吗?我更喜欢用代码来做,而不下载任何第三方库或应用程序;安全部门对此不太感兴趣……


当前回答

String ZipPath = @"c:\my\data.zip";
String extractPath = @"d:\\myunzips";
ZipFile.ExtractToDirectory(ZipPath, extractPath);

要使用ZipFile类,必须在项目中添加对system . io . compress . filesystem程序集的引用

其他回答

这将完成system . io . compress . zipfile。ExtractToDirectory (ZipName ExtractToPath)

你可以在. net 3.5中使用DeflateStream来完成这一切。. net 3.5中缺少的是处理用于组织压缩文件的文件头部分的能力。PKWare已经发布了这些信息,您可以在创建使用的结构后使用这些信息来处理zip文件。它不是特别繁重,而且在不使用第三方代码的情况下构建工具是一种很好的实践。

这不是一个简单的答案,但如果你愿意并且能够自己花时间,这是完全可行的。我在几个小时内编写了一个类来完成这个任务,从中我得到的是仅使用。net 3.5压缩和解压缩文件的能力。

从这里开始:

已写入压缩的GZipStream对象 扩展名为。gz的文件可以 常用的解压方法有很多 压缩工具;然而,这个类 并不天生提供 向或中添加文件的功能 从.zip档案中提取文件。

对于。net 4.5+

并不总是希望将未压缩的文件写入磁盘。作为ASP。Net开发人员,我将不得不摆弄权限来授予我的应用程序写入文件系统的权利。通过使用内存中的流,我可以绕过所有这些,直接读取文件:

using (ZipArchive archive = new ZipArchive(postedZipStream))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
         var stream = entry.Open();
         //Do awesome stream stuff!!
    }
}

或者,您仍然可以通过调用ExtractToFile()将解压缩的文件写入磁盘:

using (ZipArchive archive = ZipFile.OpenRead(pathToZip))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        entry.ExtractToFile(Path.Combine(destination, entry.FullName));
    }
} 

要使用ZipArchive类,您需要添加对System.IO.Compression命名空间和System.IO.Compression. filesystem的引用。

String ZipPath = @"c:\my\data.zip";
String extractPath = @"d:\\myunzips";
ZipFile.ExtractToDirectory(ZipPath, extractPath);

要使用ZipFile类,必须在项目中添加对system . io . compress . filesystem程序集的引用