Frage

ich einen Code haben, dass Downloads gzip-Dateien und dekomprimiert sie. Das Problem ist, ich kann sie nicht die ganze Datei entpacken, es liest nur die ersten 4096 Bytes und dann etwa 500 mehr.

Byte[] buffer = new Byte[4096];
int count = 0;
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None);
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true);

// Read from gzip steam
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
{
    // Write to output file
    fileOutput.Write(buffer, 0, count);
}

// Close the streams
...

Ich habe die heruntergeladene Datei überprüft; es ist 13MB, wenn sie komprimiert und enthält eine XML-Datei. Ich habe manuell die XML-Datei dekomprimiert, und der Inhalt ist alles da. Aber wenn ich es mit diesem Code zu tun, es gibt nur den Anfang der XML-Datei.

Wer irgendwelche Ideen, warum dies passiert sein könnte?

War es hilfreich?

Lösung 2

ich am Ende einer gzip Executable mit der Dekompression statt einem GZipStream zu tun. Es kann nicht die Datei aus irgendeinem Grunde umgehen, aber die ausführbare Datei kann.

Andere Tipps

Bearbeiten

Versuchen Sie nicht, die GZipStream offen lassen:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress,  
                                                                         false);

oder

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress);

Die gleiche Sache mir passiert ist. In meinem Fall liest nur 6 Zeilen und dann das Ende der Datei erreicht. So wurde mir klar, dass, obwohl die Erweiterung gz ist, er durch einen anderen Algorithmus nicht von GZipStream unterstützt komprimiert wurde. So habe ich SevenZipSharp Bibliothek und es funktionierte. Dies ist mein Code

Sie können SevenZipSharp Bibliothek verwenden

using (var input = File.OpenRead(lstFiles[0]))
{
    using (var ds = new SevenZipExtractor(input))
    {
        //ds.ExtractionFinished += DsOnExtractionFinished;

        var mem = new MemoryStream();
        ds.ExtractFile(0, mem);

        using (var sr = new StreamReader(mem))
        {
            var iCount = 0;
            String line;
            mem.Position = 0;
            while ((line = sr.ReadLine()) != null && iCount < 100)
            {
                iCount++;
                LstOutput.Items.Add(line);
            }

        }
    }
} 

Rufst du Close oder Flush auf fileOutput? (Oder wickeln Sie es nur in einer using, die Praxis wird empfohlen.) Wenn Sie die Datei nicht tun möglicherweise nicht auf die Festplatte geschrieben werden, wenn das Programm beendet.

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