Bin ich wirklich gezwungen, ReadToEnd () einen StreamReader zu lesen, der einen Ionic.Zlib.GZipStream liest?

9

Ich verwende den folgenden Code, um einen GZipStream zu dekomprimieren (mithilfe der DotNetZip-Bibliothek ), wobei fs ein Dateistream ist, der auf eine gz-Datei verweist (mit FileMode.Open, FileAccess.Read, FileShare.ReadWrite):

%Vor%

Aber wenn die Datei nicht bis zum Ende gelesen wird (was ich am liebsten mache, wenn sie nicht benötigt wird, da die Datei sehr groß sein kann), löst sie

aus

ZlibException("Bad CRC32 in GZIP trailer. (actual(EC084966)!=expected(8FC3EF16))")

bei der ersten schließenden Klammer (eigentlich beim Versuch, den StreamReader zu schließen.).

Wenn jetzt ReadToEnd () aufgerufen wird, bevor der streamreader geschlossen wird (oder ich alle Zeilen mit einer while-Schleife (! sr.EndOfStream) lese), funktioniert es. Ich habe das gleiche Verhalten bei einer 500 MB und 200 KB komprimierten Datei beobachtet, so scheint es, dass es nicht mit der Dateigröße zusammenhängt.

Ihr Einblick ist sehr willkommen!

Hier ist ein Link zu einem einfachen dedizierten Testprojekt .

Es funktioniert mit der System.IO.GZipStream-Bibliothek, das ist also sehr seltsam.

    
Erwin Mayer 18.09.2011, 14:45
quelle

2 Antworten

4

Als Vermutung vermute ich, dass, wenn der CRC-Block am Ende der Datei steht, ich beim Lesen des Streams die Integrität nicht verifizieren kann, während er den Stream entsorgt und daher die Ausnahme auslöst.

Dies erklärt jedoch nicht, warum es funktioniert, wenn System.IO.GzipStream verwendet wird.

Ich fand den relevanten Teil des Quellcodes von DotNetZip hier , aber es scheint so überprüfen, dass der Stream bis zum Ende gelesen wird (siehe // Make sure we have read to the end of the stream ). Dann berechnen sie eine CRC32, da die Ausnahmemeldung eine zeigt.

    
Erwin Mayer 18.09.2011, 16:48
quelle
0

Überprüfen Sie, ob das Laufwerk, auf dem Sie schreiben, nicht über genügend Speicherplatz verfügt. Ich hatte diesen Fehler und es dauerte eine Weile, aber ich fand heraus, dass ich wirklich keinen Platz mehr hatte.

    
user2421536 26.05.2013 03:29
quelle