2014-09-18 15 views
5

Ich habe eine Gzip-Datei mit einer TXT-Datei, die bereinigt werden muss. Ich mag von der GZipped Datei Zeile für Zeile lesen und dann zu einem Ausgang GZIP Datei, die alle in einem Schuss wie dies den gereinigten Inhalt schreiben:GZipStream mit StreamReader.ReadLine liest nur die erste Zeile

void ExtractAndFix(string inputPath, string outputPath) { 
     StringBuilder sbLine = new StringBuilder(); 

     using (GZipStream gzInput = new GZipStream(new FileStream(inputPath, FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) { 
      using (StreamReader reader = new StreamReader(gzInput, Encoding.UTF8)) { 
       using (GZipOutputStream gzipWriter = new GZipOutputStream(new FileStream(outputPath, FileMode.Create))) { 
        string line = null; 
        while ((line = reader.ReadLine()) != null) { 
         sbLine.Clear(); 
         sbLine.Append(line.Replace("\t", " ")); 
         sbLine.Append("\r\n"); 
         byte[] bytes = Encoding.UTF8.GetBytes(sbLine.ToString()); 
         gzipWriter.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
     } 
    } 

Aber aus irgendeinem Grunde, der Linie nennen = reader.ReadLine () in der while-Schleife liest nur einmal und gibt dann null zurück (Leser EOS = true). Ich habe dies sowohl mit der nativen C# -Komprimierungsbibliothek als auch mit dem ICSharpCode-Paket versucht, und ich bekomme das gleiche Verhalten. Mir ist klar, dass ich immer nur die komplette Datei extrahieren, dann säubern und komprimieren kann, aber ich hasse es, Ressourcen, Festplattenplatz usw. zu verschwenden. Anmerkung: Das sind große Dateien (bis zu mehreren GB komprimiert), also alles mit MemoryStream wird keine gute Lösung sein. Ist jemand schon einmal auf so etwas Seltsames gestoßen? Vielen Dank.

+0

Sind Sie sicher, dass die Datei tatsächlich nur komprimierte Stream und nicht Zip-Archiv ist? –

+2

@ Alexei Levenkov - Wenn es Zip wäre, wäre es nie in der Lage, den GZip-Stream zu erstellen, es würde fehlschlagen, weil der Dateityp falsch wäre – bruiseruser

+0

Mögliches Duplikat von [Dekomprimieren mit GZipStream gibt nur die erste Zeile zurück] (http: // stackoverflow .com/questions/11204330/dekomprimieren-verwenden-gzipstream-returns-only-the-first-line – Sam

Antwort

6

Nach viel Haarziehen habe ich das Problem gefunden. Für mich wurde das Problem zusätzlich durch die Tatsache verstärkt, dass bestimmte GZip-Dateien gut funktionieren würden, während andere das oben beschriebene Verhalten zeigen würden. Wenn ich zum Beispiel das Archiv selbst mit GZip erstellen würde, würde es großartig funktionieren, aber bestimmte andere Archive, die aus anderen Quellen stammen, würden nicht funktionieren.

Kurz gesagt, die .NET GZip-Bibliothek ist Müll, nicht benutzen. Außerdem war die ICSharpCode-Bibliothek, die ich benutzte, ein paar Jahre alt. Ich bin mir nicht sicher, ob es früher den zugrundeliegenden .NET-Code pendelte oder nicht, aber die Version, die ich zuvor (0.85.4) hatte, gab genau das gleiche Verhalten. Als ich auf die neueste Version (0.86.0) aktualisiert habe, hat es wie erwartet funktioniert und ich konnte die vollständige Datei wie erwartet lesen.

Hoffentlich hilft dies jemand anderen mit dem gleichen Problem

Verwandte Themen