解压缩使用GZipStream只返回第一线(Decompressing using GZipStre

2019-06-25 19:10发布

我一直工作在解析第三方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;
        }
    }

Answer 1:

我已经把最后45分钟环绕我的头围绕这个问题,但我无法解释为什么它不工作。 不知怎的,DeflateStream类未正确解码数据。 我写了我自己用gzip解析器(如果有人想检查我可以共享代码)读取所有的头,并检查其有效性(以确保有没有有趣的东西有),然后使用DeflateStream膨胀的实际的数据,但在你的文件时,它仍然只是让我的第一道防线。

如果我重新压缩使用使用GZipStream你的日志文件(第一后用WinRAR解压缩它),那么它被解压缩只需再次罚款我都我自己的解析器和你自己的样品。

似乎有关于微软实施的放气(http://www.virtualdub.org/blog/pivot/entry.php?id=335)净一些critizism所以它可能是,你发现它的怪癖之一。

然而,一个简单的解决问题的方法是切换到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);
        }
    }


文章来源: Decompressing using GZipStream returns only the first line