Frage

Ich erhalte eine Ausnahme beim Versuch, eine (gz) Datei entpacken Sie die GZipStream-Klasse, die im .NET Framework enthalten ist. Ich bin mit der MSDN-Dokumentation. Dies ist die Ausnahme:

  

Schreiben an den Kompressionsstrom wird nicht unterstützt.

Hier ist die Anwendung Quelle:

 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 {...}

Die Ausnahme am compressedZipStream.write geworfen wird ().

Irgendwelche Ideen? Was ist diese Ausnahme mir zu sagen?

War es hilfreich?

Lösung

Es ist Ihnen zu sagen, dass Sie es die Dekompression Read statt Write da nennen sollen! Auch sollte der Speicher-Stream mit den Daten konstruiert werden, oder vielmehr sollten Sie die Datei-Stream direkt auf den GZipStream Konstruktor übergeben.

Beispiel dafür, wie es sollte getan haben (habe nicht versucht, es zu kompilieren):

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

Andere Tipps

Der Komprimierungscode nicht funktioniert wie Verschlüsselung - Sie können dekomprimieren nicht von einem Strom zum anderen durch die komprimierten Daten zu schreiben. Sie haben einen Strom bereitzustellen, die die komprimierten Daten bereits enthält und lassen GZipStream von ihr lesen. So etwas wie folgt aus:

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 ist eine einfache Dienstprogramm Methode von einem Stream zu lesen und kopieren Sie alle Daten auf einem anderen. So etwas wie folgt aus:

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);
    }
}

Wie Kompression Ströme Arbeit kann auf den ersten rätselhaft.

Beim Lesen nimmt komprimiert Daten und Schreiben nehmen unkomprimiert Daten. Alles in allem, können Sie die Strom sorgt nur „sehen“ unkomprimierten Daten zu allen Zeiten.

Der richtige Weg zu erreichen, was Sie zu tun versuchen, ist die GZipStream zu lesen und anschließend schreibt auch den GZipStream verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top