.NET 3.5 中是否有内置的压缩库?

32

.NET 3.5中是否有内置的zip库?

如果没有,有哪些流行的开源.net zip库。

9个回答

32

编辑说明:请查看评论中的说明 - SharpZipLib现在已经不再维护,您可能希望避免使用它。

开源:#ZipLib

我认为System.IO.Compression命名空间中的类对于压缩/解压缩单个数据流已经足够了,但是框架本身没有内置用于处理实际zip文件的功能。

编辑说明:正如Ants答案中所指出的那样,有System.IO.Packaging.ZipPackage,但看起来这确实是为WPF设计的,对于一般的zip文件处理来说并不方便。不过值得探究。我之前还不知道它... 绝对值得研究。


C# 4.0 不会原生支持这个吗?我记得在某处看到过。但我以前用过 ZipLib,很成功。 - Jon Erickson
我发现SharpZipLib API可能比它需要的更加复杂。此外,它不仅仅是zip - tar,bzip,还有其他我不知道的东西。如果你只想要zip,那么可能会觉得“太多了”。最后,是否有一些功能缺失?例如进度事件?AES?也许这些正在开发中,但我不确定。 - Cheeso
SharpZipLib未维护且存在许多错误。最近一次发布是在2010年6月。它有时会出现问题,不能正确处理由7zip、ioniczip等软件生成的zip文件,尽管这些zip文件本身是完好无损的。我们在工作中使用它作为一个组件,但必须要修改源代码并进行本地构建,这不是一个轻松的过程,如果你正在寻找一个开箱即用的zip库,则不建议使用SharpZipLib。 - aggieNick02
1
我不确定 ZipPackage 会有什么不方便之处。你只需要一个允许将文件添加到 zip 并从 zip 中检索的库即可。你可能需要多复杂呢?此外,你能详细说明一下为什么它看起来是为 WPF 设计的吗? - The Muffin Man
2
@TheMuffinMan:问题在于ZipPackage相对于那些要求——关系、部件等等——确实是复杂的。它是一个更大的打包框架的一部分。至于与WPF的关系——这主要是基于WindowsBase.dll中还有什么其他内容,其中大部分似乎与WPF相关。 - Jon Skeet
显示剩余2条评论

23

没有内置库可用,但有一些开源选项。

DotNetZip 是其中之一。它简单易用且具备很好的功能:AES加密、普通加密、流、ZIP64、文件注释、Unicode、进度事件等等。而且它是免费且开源的。

以下是一些示例代码。

    // extract all Photoshop files larger than 100mb
    using (ZipFile zip1 = ZipFile.Read(ZipFileName))
    {
        var LargePhotoShopFiles = zip1.SelectEntries("name = *.psd  and size > 100mb");
        foreach (ZipEntry e in LargePhotoShopFiles)
        {
            if (e.UsesEncryption)
                e.ExtractWithPassword("unpackDirectory", "VerySecret!");
            else 
                e.Extract("unpackDirectory");
        }
    }

1
我对这个库印象非常深刻。现在正在非常成功地使用它 - 感谢您的提醒。 - Guy
@Chesso,从3.5版本开始,您可以在http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx找到新的zip库。 - Avram
1
Avram,System.IO.Packaging 不是一个真正的 zip 库。 - Cheeso
@Cheeso,它为什么不是一个“真正的”zip库?它没有完成任何zip库所期望的功能吗? - The Muffin Man
1
看起来这个答案中链接的原始源现在有点过时了,最后更新是在2011年7月。这里有一个分支,它有更新的错误修复,并且可以通过NuGet获得:https://github.com/haf/DotNetZip.Semverd - HotN

10

请查看 System.IO.Packaging.ZipPackage 类。


5
需要将内容打包成一种特定的格式,该格式需要在压缩文件中添加一个XML文件以定义布局。这不是通用的压缩库。 - Jeff Moser
在标准参考的.Net库中找到它存在问题,(http://blogs.msdn.com/b/dmahugh/archive/2006/12/14/finding-windowsbase-dll.aspx) - Avram

6

7Zip可以帮助你,而且它支持多种语言。


你链接的LZMA SDK不能读取或写入ZIP文件。可能可以使用7Zip DLL,但我不确定是否有相关文档... - sourcenouveau


1

.Net 4.5引入了ZipArchive类,位于System.IO.Compression命名空间中。


1

我也会推荐http://www.7-zip.org/sdk.html LZMA SDK,但它不是ZIP格式。

  1. 它是公共领域的
  2. 解压速度非常快
  3. 它有完全托管的实现
  4. 它比ZIP/RAR更好地压缩
  5. 它的占用空间非常小
  6. 它可以作为流工作

没有回答问题。问题是关于zip库,而不是zip库的替代方案。在许多情况下,规格已经为您设置好了,或者您正在使用第三方组件来生成某个特定规格。 - Kir

1
尝试使用 System.IO.Compression.DeflateStream

4
不,DeflateStream不能处理ZIP文件。值得一提的是,内置的GZipStream也不能。此外,这两种流在处理先前压缩或无法压缩的数据时会表现出异常的压缩行为,它们实际上可能会增加数据的大小。你已经被警告了! - Cheeso

0
你可以使用以下方法解压缩zip文件:
    public static void UnZip(string zipFile, string folderPath)
    {
        if (!File.Exists(zipFile))
            throw new FileNotFoundException();

        if (!Directory.Exists(folderPath))
            Directory.CreateDirectory(folderPath);


        var t = Type.GetTypeFromProgID("Shell.Application");

        dynamic shellApplication = Activator.CreateInstance(t);

        dynamic destinationFolder = shellApplication.NameSpace(folderPath);
        dynamic sourceFile = shellApplication.NameSpace(zipFile);

        foreach (var file in sourceFile.Items())
        {
            destinationFolder.CopyHere(file, 4 | 16);
        }
    }

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