在.NET中创建ZIP归档文件的最佳/最简单方法是什么?

34

您认为哪种方法是“最好”的呢?

  • 使用 System.IO.Packaging 命名空间?
  • 与 Shell 进行互操作?
  • 使用 .NET 的第三方库?
  • 与开源非托管 DLL 进行互操作?

[我可以针对 Framework 3.5;最佳 = 设计,实现和维护最简单。]

我主要关注的是您为什么认为所选择的方法是最好的。


如果您发现这个问题并且使用的是.NET 4.5或更高版本,请查看Sheridan在下面的答案:https://dev59.com/bXRC5IYBdhLWcg3wK96V#23560331 - Krisztián Balla
8个回答

23

我一直使用 SharpZipLib

忘了为什么:主要是因为它已经存在了很长时间。 它有很好的文档,并且具有直观的API。 此外,如果你喜欢开源软件,它也是开源的。


3
有良好的文档记录吗?我一无所获,你能指点我正确的方向吗? - mafu
此外,SharpZipLib 是在 GPL 下授权的,因此您可能不希望将其用于商业应用程序。但是,在开源应用程序中使用它不应该有任何问题。 - JebaDaHut
这个库真的很复杂 ;( - Piotr Kula

16

我发现DotNetZip库是处理zip文件最简便的方式。而SharpZipLib则是一种更为强大和灵活的解决方案。


1
我曾经也是那个库的忠实粉丝,直到我遇到了文件损坏的问题。虽然该问题并未被项目所有者视为关键问题,而且该项目似乎已经不再活跃(两年多没有更新/修复),但是有一个解决方法可用,请参见:http://dotnetzip.codeplex.com/workitem/14087 - Dirk Vollmar

16

我知道这已经是一个老问题了,但我想添加一个更加最新的答案。如果你使用的是.NET 4.5,那么你可以使用新的内置ZipFile轻松地以编程方式将多个文件保存到ZIP文件夹中。

首先,您需要将文件准备好放入一个新文件夹中(Directory.CreateDirectory, File.Move),然后您就可以简单地使用ZipFile.CreateFromDirectory方法(改编自链接页面):

string filePathOfNewFolder = @"c:\example\start";
string zipFilePath = @"c:\example\result.zip";

ZipFile.CreateFromDirectory(filePathOfNewFolder, zipFilePath);

1
+1 表示更新旧问题并提供更好的答案(而且还是更好的答案)。 - Gayot Fow
注意:zipFilePath不能在指定的文件夹中找到,否则ZipFile.CreateFromDirectory将会抛出一个文件正在被另一个进程使用的异常。 - Krisztián Balla
@Sheridan:我已经按照这里的建议使用了.NET 4.5的ZipFile类。压缩文件的大小是25MB。我希望将压缩文件分割成每个文件10MB。你能帮助我实现这个吗? - navbingo

16

DotNetZip非常易于使用。我喜欢它,因为它完全受控制-不需要与 shell 交互。编程模型比 shell 更简单清晰。而且它比SharpZipLib和.NET 3.0中添加的 Packaging 类更简单。它是免费的、小巧的、活跃维护的。

它比一个用户提供的 J# 选项要好得多-J# 是一个巨大的运行时环境,只为了获取 ZIP 支持就需要吞下一颗巨大的药丸。而且 J# 的支持正在被终止。引入新的依赖关系可能并不是一个好主意。

DotNetZip 的示例代码:

  try
  {
      using (ZipFile zip = new ZipFile(args[0], System.Console.Out))
      {
          zip.AddDirectory(args[1]); // recurses subdirectories
          zip.Save();
      }
  }
  catch (System.Exception ex1)
  {
      System.Console.Error.WriteLine("exception: " + ex1);
  }

DotNetZip可以与.NET v2.0、3.0、3.5以及Compact Framework v2.0和3.5一起使用。它支持ZIP文件、Unicode文件名、注释、密码。它支持ZIP64以及自解压缩存档。它的速度很快。试一下吧。


1
非常易于使用的API和文档完善。选择这个绝对没错。 - Klaus Nji
除非文件名中包含西里尔字母,否则它不会对文件造成影响。 - chester89
不是真的@chester89,它可以使用UTF-8文件名。请查看Unicode文档。您需要设置Unicode标志才能执行此操作;原因是在创建此库时,Zip工具中并不广泛使用Unicode。甚至Winzip也不支持Unicode。甚至规范也不支持。因此,Unicode被留作选择性加入。只需搜索“dotnetzip unicode”,您就会找到代码示例。 - Cheeso
@Cheeso 好的,我来看看。当我的代码没有按照预期工作时,我感到非常惊讶。谢谢。 - chester89
1
我曾经也是那个库的忠实粉丝,直到我遇到了文件损坏的问题。虽然该问题并未被项目所有者视为关键问题,而且该项目似乎已经不再活跃(两年多没有更新/修复),但是有一个解决方法可用,请参见:http://dotnetzip.codeplex.com/workitem/14087 - Dirk Vollmar

2
在System.IO.Compression命名空间下,GZipStream和DeflateStream类使压缩变得非常容易。
更新: 评论正确指出这些类不允许您操作Zip文件。然而,J# dlls在java.util和java.io命名空间中包含所需的功能。有关详细信息,请参见dmihailescu的Code Project文章,其中详细说明了它们的使用并提供了示例代码。

1
如果我没记错的话:这些只是压缩算法,不允许进行归档(多个压缩条目)。 - Greg Dean
就像Greg所说的那样,它们不创建ZIP归档文件。只有GZip流式传输,这对于HTTP文件传输、压缩自己的文件格式等非常有用。但不适用于创建Zip文件。 - configurator
2
不要使用J# dll来读写zip文件。为什么?让我数一数:J#已经停止支持。J#运行时非常庞大。该库不太适用于.NET(没有事件,没有属性,没有Dispose等)。zip实现过时、不完整(不支持zip密码、没有ZIP64等)且存在缺陷。请使用第三方库。 - Cheeso

2

目前还没有人提到Xceed Zip组件。我之前使用过它,对于创建zip文件和压缩数据流非常出色。我强烈推荐它,但可能需要支付许可费。


的确,许可费用是我不推荐它的原因 - 虽然它的工作非常好,但SharpZipLib也能够做到,并且是免费的。 - configurator
1
SharpZipLib是根据修改的GPL许可证授权的,这可能会在某些情况下引起问题。 - Martin Vobr

1

由于您的目标是 Framework 3.5,我建议使用 System.IO.Packaging。它是一个专门用于压缩的库,并且随着框架一起提供,因此产品中甚至不需要额外的 DLL。但是,使用示例非常糟糕。

不推荐使用 shell。首先,它只适用于 Windows XP 及以上版本。但即使您不关心这一点,它的缺陷也很多(我以前做过,但那时真的没有选择)。

如果您的目标不是 3.5,我建议使用 SharpZipLib。它是一个相当不错的库,即使您正在使用 3.5,也可以考虑使用它。


3
System.IO.Packaging 用于读写新的 Office 2007 格式,是为此而开发的。例如,它不是一个通用的 zip 实现,并因此有一些限制。 - liggett78
你能详细说明一下这些限制吗?我还没有使用过那个库,想要更多的信息。 - configurator

0
Ultimate ZIP是一个高性能、可靠的压缩组件,可以让您轻松地在.NET跨平台应用程序中实时创建和操作ZIP、TAR、TGZ、GZ归档文件,并浏览先前创建的归档文件的内容。它完全采用C#编写,应用了最佳设计模式和底层.NET优化,为您的.NET应用程序提供了性能、可靠性和可扩展性。该软件包附带了许多代码片段和VB.NET和C#的完整文档示例,说明如何创建、压缩和解压缩归档文件。

Ultimate ZIP component for .NET


链接失效了 :( - Roman Oira-Oira
链接失效了 :( - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接