8

.NET Frameworkに含まれているGZipStreamクラスを使用して(.gz)ファイルを解凍しようとすると、例外が発生します。私はMSDNのドキュメントを使用しています。これは例外です:

圧縮ストリームへの書き込みはサポートされていません。

アプリケーションソースは次のとおりです。

 try
 {
     var infile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read);
     byte[] buffer = new byte[infile.Length];
     // Read the file to ensure it is readable.
     int count = infile.Read(buffer, 0, buffer.Length);
     if (count != buffer.Length)
     {
         infile.Close();
         Console.WriteLine("Test Failed: Unable to read data from file");
         return;
     }
     infile.Close();
     MemoryStream ms = new MemoryStream();
     // Use the newly created memory stream for the compressed data.
     GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress, true);
     Console.WriteLine("Decompression");
     compressedzipStream.Write(buffer, 0, buffer.Length); //<<Throws error here
     // Close the stream.
     compressedzipStream.Close();
     Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);
} catch {...}

例外はcompressedZipStream.write()でスローされます。

何か案は?この例外は私に何を伝えていますか?

4

3 に答える 3

16

減圧なので、Read代わりに電話するべきだと言っています!Writeまた、メモリストリームはデータを使用して構築する必要があります。または、ファイルストリームをGZipStreamコンストラクターに直接渡す必要があります。

それがどのように行われるべきかの例(それをコンパイルしようとしなかった):

Stream inFile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read);
Stream decodedStream = new MemoryStream();
byte[] buffer = new byte[4096];

using (Stream inGzipStream = new GZipStream(inFile, CompressionMode.Decompress))
{
    int bytesRead;
    while ((bytesRead = inGzipStream.Read(buffer, 0, buffer.Length)) > 0)
        decodedStream.Write(buffer, 0, bytesRead);
}

// Now decodedStream contains the decoded data
于 2009-08-30T19:04:57.730 に答える
9

圧縮コードは暗号化のようには機能しません。圧縮データを書き込んで、あるストリームから別のストリームに解凍することはできません。すでに圧縮データを含むストリームを提供し、そこGZipStreamから読み取らせる必要があります。このようなもの:

using (Stream file = File.OpenRead(filename))
using (Stream gzip = new GZipStream(file, CompressionMode.Decompress))
using (Stream memoryStream = new MemoryStream())
{
   CopyStream(gzip, memoryStream);
   return memoryStream.ToArray();
}

CopyStreamは、あるストリームから読み取り、すべてのデータを別のストリームにコピーするための単純なユーティリティメソッドです。このようなもの:

static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}
于 2009-08-30T19:18:30.823 に答える
1

圧縮ストリームがどのように機能するかは、最初は不可解です。

読み取りには圧縮データが必要であり、書き込みには非圧縮データが必要です。全体として、ストリームは常に非圧縮データのみを「見る」ことを保証します。

あなたがやろうとしていることを達成するための適切な方法は、を使用して読み取り、次にalsoGZipStreamを使用して書き込むことです。GZipStream

于 2009-08-30T19:13:59.787 に答える