如何在C#中解压嵌套的GZip(TGZ)文件

4
我收到了一个TGZ文件,其中包含一个纯文本文件以及可能包含一个或多个嵌套的TGZ文件。我已经找出了如何解压主TGZ文件并读取其中包含的纯文本文件,但我还没有找到如何识别和解压嵌套的TGZ文件。有人遇到过这个问题吗?
此外,我无法控制接收到的文件,因此无法更改包含嵌套TGZ文件的TGZ文件的格式。另外一个注意点(即使我认为这没什么影响)是这些文件是在Unix或Linux环境下压缩和打包的。
感谢您提前的帮助。
3个回答

5
尝试使用免费的SharpZipLib库 (http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx),它可以让您处理TGZ文件,并且具有在尝试解压缩之前测试文件的方法; 因此,您可以依赖文件扩展名是否正确,或逐个测试它们以查看是否可以将其作为压缩文件读取-然后在主文件被解压缩后解压缩它们。

1
这个答案和Keith的答案都处理了GZip部分,但是SharpZipLib也可以处理被压缩的TAR文件,而我找不到DotNetZip库处理TAR文件的方法。 - Flahrty
1
DotNetZip 不支持处理 Tar 归档文件。!! - Cheeso
2
这对于愿意接受GNU许可证的人来说非常棒!那么对于我们其他人,是否有另一个选择? - Dan Bailiff
@DanBailiff:就记录而言,他们已经在GPL许可证中添加了一个例外,允许您在商业项目中使用它。请查看他们页面上的许可证部分:http://icsharpcode.github.io/SharpZipLib/ - SolarBear
看起来现在已经使用了MIT许可证。 - bwing

4
要从.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

Tar.cs的链接失效了,我找不到其他的链接。你能提供一个新的链接吗? - Matteus Hemström
2
是的,这里有一个活跃的链接:http://cheesoexamples.codeplex.com/SourceControl/changeset/view/97756#1868643 如果你想下载一个包含代码、自述文件和 makefile 的 zip 文件,请使用此链接:http://cheesoexamples.codeplex.com/releases/view/76708 - Cheeso
最好能够指定一个目录,将tar归档文件中的所有内容提取到该目录中。 - Sergey Kulgan

1

在 CodePlex 上看看 DotNetZip

"如果你只是想要一个更好的 DeflateStream 或 GZipStream 类来替换 .NET BCL 中内置的那个,这里也有。 DotNetZip 的 DeflateStream 和 GZipStream 可以作为独立的程序集使用,基于 .NET 版本的 Zlib。这些流支持压缩级别,并且比内置类提供更好的性能。还有一个 ZlibStream 来完成整个设置(RFC 1950、1951、1952)。

看起来你可以遍历压缩文件并从存档中取出单个文件。然后,你可以测试解压缩的文件,看看它们是否是 GZip 文件。

这是他们 示例页面 中的一段代码。

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

Keith


1
截至本文撰写时(2015年8月),DotNetZip似乎是一个被放弃的项目,存在一些重大且未修复的错误。从外观上看,我无法推荐使用它。 - SolarBear

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