我一直在研究解析第三方fms日志的功能.日志位于Gzip中,因此我使用了一种解压缩功能,该功能可用于我们使用的任何其他Gzip文件.
解压缩这些文件时,我只会得到压缩文件的第一行,这也不例外,只是找不到其余字节,就好像第一行有EOF.
我尝试使用Ionic.Zlib代替System.IO.Compression,但是结果是相同的.这些文件似乎没有任何损坏,请使用Winrar对其进行解压缩.
如果有人对如何解决此问题有任何想法,我们将不胜感激.
谢谢
您可以在此处下载示例文件:
http://www.adjustyourset.tv/fms_6F9E_20120621_0001.log.gz
这是我的减压功能:
public static bool DecompressGZip(String fileRoot, String destRoot)
{
try
{
using (FileStream fileStram = new FileStream(fileRoot, FileMode.Open, FileAccess.Read))
{
using (FileStream fOutStream = new FileStream(destRoot, FileMode.Create, FileAccess.Write))
{
using (GZipStream zipStream = new GZipStream(fileStram, CompressionMode.Decompress, true))
{
byte[] buffer = new byte[4096];
int numRead;
while ((numRead = zipStream.Read(buffer, 0, buffer.Length)) != 0)
{
fOutStream.Write(buffer, 0, numRead);
}
return true;
}
}
}
}
catch (Exception ex)
{
LogUtils.SaveToLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), "Eror decompressing " + fileRoot + " : " + ex.Message, Constants.systemLog, 209715200, 6);
return false;
}
}
解决方法:
我已经花了最后45分钟来解决这个问题,但我无法解释为什么它不起作用. DeflateStream类不知何故无法正确解码您的数据.我编写了自己的GZip解析器(如果有人想检查它,我可以共享代码),它读取所有标头并检查其有效性(以确保其中没有有趣的东西),然后使用DeflateStream来对实际数据,但对于您的文件,它仍然只是我的第一行.
如果我使用GZipStream使用您的日志文件重新压缩(首先使用winrar解压缩之后),那么我自己的解析器和您自己的示例都可以再次解压缩.
网上似乎有人对Microsoft实施Deflate(http://www.virtualdub.org/blog/pivot/entry.php?id=335)提出批评,因此可能是您发现了其中一个怪癖.
但是,解决您的问题的简单方法是切换到SharZipLib(http://www.icsharpcode.net/opensource/sharpziplib/),我尝试了一下,它可以很好地解压缩文件.
public static void DecompressGZip(String fileRoot, String destRoot)
{
using (FileStream fileStram = new FileStream(fileRoot, FileMode.Open, FileAccess.Read))
using (GZipInputStream zipStream = new GZipInputStream(fileStram))
using (StreamReader sr = new StreamReader(zipStream))
{
string data = sr.ReadToEnd();
File.WriteAllText(destRoot, data);
}
}