【问题标题】:How to Decompress nested GZip (TGZ) files in C#如何在 C# 中解压缩嵌套的 GZip (TGZ) 文件
【发布时间】:2009-11-18 13:09:06
【问题描述】:

我收到一个 TGZ 文件,其中包含一个纯文本文件以及一个或多个嵌套的 TGZ 文件。我已经弄清楚如何解压主 TGZ 文件并读取其中包含的纯文本文件,但我无法弄清楚如何识别和解压嵌套的 TGZ 文件。有没有人遇到过这个问题?

另外,我无法控制收到的文件,因此我无法更改包含嵌套 TGZ 文件的 TGZ 文件的格式。另一个警告(尽管我认为这并不重要)是这些文件在 Unix 或 Linux 环境中被压缩和压缩。

提前感谢您的帮助。

【问题讨论】:

    标签: c# nested gzip gzipstream


    【解决方案1】:

    试试 SharpZipLib (http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx) 免费库。

    它让您可以使用 TGZ 并提供在尝试对文件进行膨胀之前测试文件的方法;因此您可以依赖正确的文件扩展名,或者单独测试它们以查看是否可以将它们作为压缩文件读取 - 然后在主文件解压缩后对它们进行膨胀。

    【讨论】:

    • 这个答案和基思的答案都处理了 GZip 部分,但是 SharpZipLib 也可以处理正在压缩的 TAR 文件,而我找不到 DotNetZip 库处理 TAR 文件的方法。
    • DotNetZip 不处理 Tar 档案。 !!
    • 这对任何愿意接受 GNU 许可证的人来说都很棒!对于我们其他人,还有其他选择吗?
    • @DanBailiff :作为记录,这可能是新的,但他们在 GPL 许可证中添加了一个例外,允许您在商业项目中使用它。看看他们页面的许可证部分:icsharpcode.github.io/SharpZipLib
    • 它现在似乎在 MIT 许可下。
    【解决方案2】:

    要从 .NET 读取和写入 .tar 和 .tgz(或 .tar.gz )文件,您可以使用这个单文件 tar 类:

    http://cheesoexamples.codeplex.com/SourceControl/changeset/view/97756#1868643

    非常简单的用法。创建存档:

    string[] filenames = { ... };
    Ionic.Tar.CreateArchive("archive.tar", filenames);
    

    创建一个压缩 (gzip'd) tar 存档:

    string[] filenames = { ... };
    Ionic.Tar.CreateArchive("archive.tgz", filenames, TarOptions.Compress);
    

    读取 tar 存档:

    var entries = Ionic.Tar.List("archive.tar");  // also handles .tgz files
    

    提取 tar 存档中的所有条目:

    var entries = Ionic.Tar.Extract("archive.tar");  // also handles .tgz files
    

    【讨论】:

    【解决方案3】:

    看看 CodePlex 上的DotNetZip

    “如果你想要一个更好的 DeflateStream 或 GZipStream 类 替换内置的 .NET BCL,也在这里。 DotNetZip 的 DeflateStream 和 GZipStream 可用于 独立程序集,基于 .NET 兹利卜港。这些流支持 压缩水平并提供很多 比内置更好的性能 类。还有一个 ZlibStream 到 完成集合(RFC 1950、1951、 1952)。”

    您似乎可以遍历压缩文件并将单个文件从存档中拉出。然后,您可以测试您解压缩的文件,看看它们是否是 GZip 文件。

    这是他们Examples Page的片段

    using (ZipFile zip = ZipFile.Read(ExistingZipFile))
    {
      foreach (ZipEntry e in zip)
      {
        e.Extract(OutputStream);
      }
    }
    

    基思

    【讨论】:

    • 截至撰写本文时(2015 年 8 月),DotNetZip 似乎是一个废弃的项目,存在一些主要的未修复错误。从外观上看,我不推荐使用它。