我有一个使用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
尝试使用SharpLib提供的方法只能在test.log中为我提供一小部分数据。
我无法找到任何代码或问题来处理包含文件夹的gzip压缩文件,而且我可以告诉你,你不应该这样做。它应该是.tar然后gzipped。
任何人都知道我可以用这个.gz文件做什么?
答案 0 :(得分:0)
首先也许尝试使用另一个lib这里有几个
http://dotnetzip.codeplex.com/
http://www.icsharpcode.net/OpenSource/SharpZipLib/
还有一个内置的GZ lib内置于.net参见
答案 1 :(得分:0)
那里只有一个文件,因此没有任何违反gzip格式的行为。 gzip允许整个路径名与文件一起存储,因此路径可能只是ghostcache / ic_split_files / CBN / 00-christmas / test.log,而7-Zip正在忠实地重新创建该路径。你应该能够在gzip头中看到这个,从大约10个字节开始。
您只返回日志的一个子集这一事实可能与gzip文件中的路径名相关,也可能与之无关。
请提供有效的.gz文件的前64个字节的十六进制转储和没有的.gz文件。