在.net中以编程方式解压缩文件

Pet*_*eri 211 c# unzip

我试图以编程方式解压缩压缩文件.

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

System.IO.InvalidDataException:GZip标头中的幻数不正确.确保您传入GZip流..

我现在意识到.zip文件与.gz文件不同,这与文件GZip不一样Zip.

但是,由于我能够通过手动双击压缩文件然后单击"提取所有文件"按钮来提取文件,我认为应该有一种在代码中执行此操作的方法.

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

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

或者还有另一种方法吗?我更喜欢在代码中执行此操作,而无需下载任何第三方库或应用程序; 安全部门对此并不太看中......

bsa*_*ara 468

使用.NET 4.5,您现在可以使用.NET框架解压缩文件:

using System;
using System.IO;

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";

      System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
      System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码直接来自Microsoft的文档:http://msdn.microsoft.com/en-us/library/ms404280(v = vs.110).aspx

ZipFile包含在程序集中System.IO.Compression.FileSystem.(感谢nateirvin ...见下面的评论)

  • BTW,`ZipFile`包含在程序集`System.IO.Compression.FileSystem`中. (112认同)
  • 这意味着您需要向框架程序集"System.IO.Compression.FileSystem.dll"添加DLL引用. (70认同)
  • 我在我的 asp.net core web api 中尝试了这个,它读取第一个条目很好,但在第二个条目上它总是给出错误“本地文件头已损坏”。对此有什么看法吗? (2认同)

Mis*_*pic 91

对于.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!!
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 是否真的需要MSFT直到4.5+才能添加本机解压缩程序? (8认同)
  • 当我只能使用“ZipFile.ExtractToDirectory(inputFile, outputDir);”时,为什么要对“ExtractToFile”使用“foreach”循环?第一种方法的优点是什么? (4认同)
  • @JohnPeters GZipStream被添加回.Net 2.0(https://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream(v=vs.80).aspx).但是,它并不容易在内存中的存档中使用多个文件.新的`ZipArchive`对象非常适合这个账单. (2认同)
  • 这是一个特别好的替代方案,因为它允许在不使用文件系统的情况下解压 **(在我的情况下,我正在使用嵌入式资源),而且它也不是第三方扩展。 (2认同)

Chr*_*way 54

我们在许多项目中成功使用了SharpZipLib.我知道这是第三方工具,但是包含了源代码,如果你选择在这里重新发明轮子,可以提供一些见解.

  • 我不了解你的公司,但我的经验一直是,如果你写一个*商业案例*描述你想要例外的原因,就可以获得这种规则的例外.指出成本节约与DIY,以及可以检查来源的事实.作为后备,你经常可以获得使用源的权限,即使它们不允许你使用dll - 然后自己编译它(或者至少是你实际需要使用的部分......). (9认同)
  • 我尝试使用SharpZipLib并且工作正常.我想我将不得不看看禁止第三方libs和apss是严格的规则还是更多的guidline. (3认同)

Luk*_*kas 54

免费,没有外部DLL文件.一切都在一个CS文件中.一个下载只是CS文件,另一个下载是一个非常容易理解的例子.刚试了今天,我简直不敢相信设置有多简单.它首先尝试,没有错误,没有任何东西.

https://github.com/jaime-olivares/zipstorer


Sam*_*Axe 27

使用http://www.codeplex.com/DotNetZip上的DotNetZip库

用于操作zip文件的类库和工具集.使用VB,C#或任何.NET语言轻松创建,提取或更新zip文件......

DotNetZip适用于具有完整.NET Framework的PC,也可以在使用.NET Compact Framework的移动设备上运行.使用VB,C#或任何.NET语言或任何脚本环境创建和读取zip文件......

如果您想要的是更好的DeflateStream或GZipStream类来替换.NET BCL中内置的那个,DotNetZip也有.DotNetZip的DeflateStream和GZipStream在基于Zlib的.NET端口的独立程序集中提供.这些流支持压缩级别,并提供比内置类更好的性能.还有一个ZlibStream来完成这个集合(RFC 1950,1951,1952)......

  • 你是多么敏锐.除非您想花几个月时间实现自己的Zip文件阅读器,否则它是您的最佳选择. (30认同)
  • 你问我有近5年的答案问题.做一些研究.我相信你会找到答案. (5认同)
  • 嗯...但那是第三方库! (2认同)
  • @PhilCooper这是一个非常古老的问题,我推荐使用内置的System.IO.Compression.ZipFile.IIRC根据我在飞行中生产数千个拉链的经验,我过去使用SharpZipLib的经历非常糟糕. (2认同)

小智 9

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

要使用ZipFile类,必须在项目中添加对System.IO.Compression.FileSystem程序集的引用