你认为哪种方法是“最好的”。
- 使用
System.IO.Packaging
命名空间? - 使用与 Shell 的互操作?
- .NET 的第三方库?
- 与开源非托管 DLL 互操作?
[我可以针对 Framework 3.5;最好 = 最容易设计、实施和维护。]
我最感兴趣的是为什么你认为选择的方法是最好的。
我一直使用SharpZipLib
忘了为什么部分:主要是因为它已经存在了很长时间。它有据可查,并且有一个直观的 API。另外,如果您喜欢这种类型的东西,它是开源的。
我发现DotNetZip 库是处理 zip 文件的最简单方法。SharpZipLib是一个更加强大和灵活的解决方案。
DotNetZip使用起来非常简单。我喜欢它,因为它是完全托管的——不需要 shell 交互。编程模型比 shell 更简单、更干净。它也比 SharpZipLib 以及 .NET 3.0 中添加的 Packaging 类更简单。它是免费的、小型的、积极维护的。
它比一个海报提供的 J# 选项要好得多 - J# 是一个巨大的运行时和一个巨大的药丸,只能吞下 ZIP 支持。J# 支持也将停止。在 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 以及自解压档案。它很快。尝试一下。
我意识到这是一个老问题,但我只是想我会添加一个更新的答案。如果您使用的是 .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);
System.IO.Compression 命名空间下的 GZipStream 和 DeflateStream 类使压缩内容变得非常容易。
更新:评论正确地指出这些类不允许您操作 Zip 文件。但是,J# dll 在 java.util 和 java.io 命名空间中包含所需的功能。有关更多详细信息,请参阅dmihailescu的代码项目文章,其中详细介绍了它们的使用并提供了示例代码。
没有人提到Xceed Zip 组件。我以前用过它,它非常适合创建 zip 文件和压缩数据流。我强烈推荐它,但可能需要权衡许可费。
由于您的目标是 Framework 3.5,我会选择System.IO.Packaging
. 它是专为压缩而设计的库,并附带框架,因此产品甚至不需要额外的 DLL。但是,使用示例很糟糕。
不推荐使用 shell。首先,它只适用于 Windows XP 及更高版本。但即使你不在乎,它的陷阱也很多(我以前做过,但只是因为我真的别无选择)。
如果您的目标不是 3.5,我会使用SharpZipLib
. 这是一个相当不错的库,即使您使用的是 3.5,您也可以考虑使用它。
Ultimate ZIP 是一个高性能且可靠的压缩组件,可让您轻松创建和操作 ZIP、TAR、TGZ、GZ 档案,并在您的 .NET 跨平台中浏览先前创建的档案的内容应用。它完全用 C# 编写,应用了最佳设计模式和低级 .NET 优化,它为您的 .NET 应用程序提供了性能、可靠性和可扩展性。该软件包附带了许多代码片段和 VB.NET 和 C# 中完整记录的示例,说明了如何创建、压缩和解压缩档案。