在C#中解压缩包含文件夹的Gzip文件

时间:2012-03-14 16:16:39

标签: c# gzip

我有一个使用C#的Windows程序正在处理日志文件。其中一些不同的日志文件是gzip压缩的(例如test.log.gz)。我有使用SharpZipLib来解压缩这些日志文件的代码,它运行得非常好。

public static void unZip(string gzipFilePath, string targetDir)
{
    byte[] dataBuffer = new byte[4096];

    using (System.IO.Stream fs = new FileStream(gzipFilePath, FileMode.Open, FileAccess.Read))
    {
        using (GZipInputStream gzipStream = new GZipInputStream(fs))
        {
            string fnOut = Path.Combine(targetDir, Path.GetFileNameWithoutExtension(gzipFilePath));

            using (FileStream fsOut = File.Create(fnOut))
            {
                StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
            }
        }
    }
}

根据我的研究,似乎gzip文件通常是一个文件,所以它总是例如test.htm.gz.所以我会创建一个名为test.htm的文件,并将未压缩的信息放入test.htm中,这部分代码就会发生:

using (GZipInputStream gzipStream = new GZipInputStream(fs))
{
    string fnOut = Path.Combine(targetDir, Path.GetFileNameWithoutExtension(gzipFilePath));

    using (FileStream fsOut = File.Create(fnOut))
    {
        StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
    }
}

这一切都很好,但我遇到的问题是我已经获得了一个日志文件,例如,test.log.gz,其目录已压缩到其中。

当我使用7-Zip gui解压缩文件时,我需要的日志文件是文件夹中的五个目录。因此,在使用7-zip拉链后,它会输出:

folder1 -> folder2 -> folder3 -> folder4 -> folder5 -> test.log

You can see how it's labeled test.log.gz.  When I use the 7-zip gui to uncompress, instead of creating test.log, it creates a folder structure.

When I navigate through the folder the 7-Zip gui uncompressed, you find the test.log file buried five folders deep.  From what I understand, that's not how gzip is supposed to work.

尝试使用SharpLib提供的方法只能在test.log中为我提供一小部分数据。

我无法找到任何代码或问题来处理包含文件夹的gzip压缩文件,而且我可以告诉你,你不应该这样做。它应该是.tar然后gzipped。

任何人都知道我可以用这个.gz文件做什么?

2 个答案:

答案 0 :(得分:0)

首先也许尝试使用另一个lib这里有几个

http://dotnetzip.codeplex.com/

http://www.icsharpcode.net/OpenSource/SharpZipLib/

还有一个内置的GZ lib内置于.​​net参见

Unzipping a .gz file using C#

答案 1 :(得分:0)

那里只有一个文件,因此没有任何违反gzip格式的行为。 gzip允许整个路径名与文件一起存储,因此路径可能只是ghostcache / ic_split_files / CBN / 00-christmas / test.log,而7-Zip正在忠实地重新创建该路径。你应该能够在gzip头中看到这个,从大约10个字节开始。

您只返回日志的一个子集这一事实可能与gzip文件中的路径名相关,也可能与之无关。

请提供有效的.gz文件的前64个字节的十六进制转储和没有的.gz文件。