3

サードパーティの fms ログを解析する機能に取り組んできました。ログは Gzip にあるため、使用する他の Gzip ファイルで機能する解凍機能を使用します。

これらのファイルを解凍すると、圧縮ファイルの最初の行のみが取得されます。例外はありません。最初の行にEOFがあるかのように、残りのバイトが見つかりません。System.IO.Compression の代わりに Ionic.Zlib を使用してみましたが、結果は同じでした。ファイルが破損しているようには見えず、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;
        }
    }
4

1 に答える 1

4

最後の 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);
        }
    }
于 2012-06-26T11:13:09.000 に答える