2016-08-11 14 views
1

gzipファイルを解凍すると「予期しないデータの終了」というエラーメッセージが表示されるのは誰か知っていますか?GZipStreamはgzipしていますが、ungzippingファイルの末尾が「予期しないデータの末尾」

バイトデータが破損していないことを確認するには、FooTest4.csvを使用してファイルに書き込み、ファイルを正常に開くことができました。

「FooTest3.csv.gz and 'FooTest2.csv.gz」の両方が、「gzip」を解除すると「予期しないデータの終了」に遭遇しました。

public static List<byte> CompressFile(List<byte> parmRawBytes) 
    { 
     //Initialize variables... 
     List<byte> returnModifiedBytes = null; 

     File.WriteAllBytes(@"X:\FooTest4.csv", parmRawBytes.ToArray()); 

     using (var memoryStream = new MemoryStream()) 
     { 
      using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, false)) 
      { 
       gzipStream.Write(parmRawBytes.ToArray(), 0, parmRawBytes.ToArray().Length); 
       gzipStream.Flush(); 
       File.WriteAllBytes(@"X:\FooTest3.csv.gz", memoryStream.ToArray()); 
       returnModifiedBytes = memoryStream.ToArray().ToList(); 
      } 
     } 

     File.WriteAllBytes(@"X:\FooTest2.csv.gz", returnModifiedBytes.ToArray()); 

     return returnModifiedBytes; 
    } 
+2

あなたは 'memoryStream.ToArray()'を早めに呼び出します: 'GZipStream.Dispose'は物事を基本ストリームに書き込みます。 'gzipStream.Flush'(moot)への呼び出しを取り除き、内側の' using'ブロックの下から 'memoryStream.ToArray()'へ呼び出しを引きます。 – ach

+0

'memoryStream.ToArray()'を呼び出すと、それはどういう意味ですか? – fletchsod

+0

それを外側の 'using'ブロックの内側に置きますが、内側の外側に置いてください:' using(var memoryStream = ...){using(var gzipStream = ...){gzipStream.Write(...);} } memoryStream.ToArray(); } '。 – ach

答えて

0

GZipエンコードを完了するには、バッファの最後に終了データを書き込むことができるように、GZipStreamを終了する必要があります。

byte[] inputBytes = ...; 
using (var compressedStream = new MemoryStream()) 
{ 
    using (var compressor = new GZipStream(compressedStream, CompressionMode.Compress)) 
    { 
     compressor.Write(inputBytes, 0, inputBytes.Length); 
    } 

    // get bytes after the gzip stream is closed 
    File.WriteAllBytes(pathToFile, compressedStream.ToArray()); 
} 
+0

古いポストを閉じることができるようにポイントを与える。私は1年前に仕事をしたことを覚えていません。 :-) – fletchsod

0

バイトをロードする代わりに、圧縮して保存する代わりに、圧縮と書き込みを同時に行うことができます。また、byte[]の代わりにList<Byte>を使用している理由がわかりません。多分これかもしれません。

void CompressFile(string inputPath, string outputPath) 
{ 
    Stream readStream = new FileStream(inputPath, Filemode.Open); 
    Stream writeStream = new FileStream(outputPath, FileMode.Create); 
    Stream compressionStream = new GZipStream(writeStream. CompressionMode.Compress); 
    byte[] data = new byte[readStream.Length]; 
    readStream.Read(data, 0, data.Length); 
    compressionStream.Write(data, 0, data.Length); 
    readStream.Close(); 
    writeStream.Close();  
} 

byte[] CompressFile(string inputPath) 
{ 
    byte[] data = File.ReadAllBytes(inputPath); 
    MemoryStream memStream = new MemoryStream(data); 
    var gzipStream = new GZipStream(memStream, CompressionMode.Compress); 
    gzipStream.Write(data, 0, data.Length); 
    gzipStream.Close(); 
    return gzipStream.ToArray(); 
} 

PS:テキストエディタでコードを書いたので、エラーが発生する可能性があります。また、エラーが "unzippiing"にあると言うと、なぜ私たちに解凍コードを表示しないのですか?

+0

ディスクに書きたくないだけで、メモリに書き込むだけです。 – fletchsod

+0

あなたのコードでは、ディスクに書き込んでいます。私は答えを編集します。 – null

+0

デバッグ用の部分です。戻り値はバイトデータを返します。しかたがない。 – fletchsod

関連する問題