【问题标题】:Unzipping a .gz file using C#使用 C# 解压缩 .gz 文件
【发布时间】:2009-08-28 16:46:35
【问题描述】:

我有一个名为 ZippedXmls.tar.gz 的 tarred gunzip 文件,其中包含 2 个 xml。 我需要以编程方式解压缩此文件,输出应该是复制到文件夹中的 2 个 xml。

如何使用 C# 实现这一点?

【问题讨论】:

  • 如何在一个 .gz 文件中存储两个 2“xml”?还是它实际上是一个 .tar.gz 文件?
  • 请注意,gzip 标准仅压缩和解压缩字节流 - 如果您有压缩的文件组,它们很可能在被 gzip 之前存档为单个文件,正如 dtb 所暗示的那样。

标签: c#


【解决方案1】:

我知道这个问题很古老,但是搜索引擎会重定向到这里以了解如何在 C# 中提取 gzip,所以我想我会提供一个稍微更新的示例:

using (var inputFileStream = new FileStream("c:\\myfile.xml.gz", FileMode.Open))
using (var gzipStream = new GZipStream(inputFileStream, CompressionMode.Decompress))
using (var outputFileStream = new FileStream("c:\\myfile.xml", FileMode.Create))
{
    await gzipStream.CopyToAsync(outputFileStream);
}

关于如何解压的更简单的问题,请参见:Decompress tar files using C#

【讨论】:

    【解决方案2】:

    我使用 .Net 的内置 GZipStream 来压缩字节流,它工作得很好。我怀疑你的文件在被 gzip 压缩之前先被 tar 了。

    您已要求提供代码,因此这里有一个示例,假设您有一个已压缩的文件:

    FileStream stream = new FileStream("output.xml", FileMode.Create); // this is the output
    GZipStream uncompressed = new GZipStream(stream, CompressionMode.Decompress);
    
    uncompressed.Write(bytes,0,bytes.Length); // write all compressed bytes
    uncompressed.Flush();
    uncompressed.Close();
    
    stream.Dispose();
    

    编辑:

    您已更改您的问题,因此该文件是 tar.gz 文件 - 从技术上讲,我的回答不适用于您的情况,但我会将其留给想要处理 .gz 文件的人。

    【讨论】:

    • 是的,该文件是 tarred 然后压缩的。在这种情况下我如何检索 2 个 xml?谢谢您的帮助。
    • sharpziplib 就是你想要使用的。它处理 tar.gz 文件。
    • 实际上这段代码在我的机器上死掉了,抱怨不支持写入压缩流......
    • @Lorgarn 并非所有流操作都受支持。你包装的是什么类型的流?
    • 链接的MS文档有一个完美的例子
    【解决方案3】:

    sharpziplib 应该可以做到这一点

    【讨论】: