1

私の GZipStream は、ファイルの最初の行のみを解凍します。7-zip を使用して内容を抽出すると、期待どおりに機能し、ファイルの内容全体が得られます。また、cygwin と Linux で gunzip を使用して期待どおりに抽出されるため、これは O/S 固有 (Windows 7) であると予想されます。

これをトラブルシューティングする方法がわからないので、そのヒントがあれば大いに役立ちます。これと非常に似ているように聞こえますが、SharpZLib を使用しても同じ結果になります。

これが私がやっていることです:

var inputFile = String.Format(@"{0}\{1}", inputDir, fileName);
var outputFile = String.Format(@"{0}\{1}.gz", inputDir, fileName);
var dcmpFile = String.Format(@"{0}\{1}", outputDir, fileName);

    using (var input = File.OpenRead(inputFile)) 
    using (var fileOutput = File.Open(outputFile, FileMode.Append))
    using (GZipStream gzOutput = new GZipStream(fileOutput, CompressionMode.Compress, true))
    {
        input.CopyTo(gzOutput);
    }

// Now, decompress
using (FileStream of = new FileStream(outputFile, FileMode.Open, FileAccess.Read))
using (GZipStream ogz = new GZipStream(of, CompressionMode.Decompress, false))
using (FileStream wf = new FileStream(dcmpFile, FileMode.Append, FileAccess.Write))
{
    ogz.CopyTo(wf); 
}
4

1 に答える 1

4

出力ファイルには 1 行 (gzip 圧縮)しか含まれていませんが、改行以外のすべてのテキスト データが含まれています。

改行なしReadLine()でテキスト行を返し、そのテキストをバイトに変換するを繰り返し呼び出しています。したがって、次のような入力ファイルがあるとします。

abc
def
ghi

圧縮されたバージョンの出力ファイルになります

abcdefghi

その動作が望ましくない場合は、そもそも a を実行する必要がありますStreamReaderか? 一度に入力から a ブロックにFileStream直接コピーするか、.NET 4 を使用している場合は使用します。GZipStreamStream.CopyTo

// Note how much simpler the code is using File.*
using (var input = File.OpenRead(inputFile))
using (var fileOutput = File.Open(outputFile, FileMode.Append))
using (GZipStream gzOutput = new GZipStream(os, CompressionMode.Compress, true)) 
{
    input.CopyTo(gzOutput);
}

また、単一のファイル内の複数の「チャンク」を特別に処理する場合を除き、圧縮ファイルに追加することはほとんど良い考えではないことに注意してください。

于 2012-06-26T19:30:59.053 に答える