GZipStream не читает весь файл

У меня есть код, который загружает файлы gzipped и распаковывает их. Проблема в том, что я не могу заставить его распаковать весь файл, он читает только первые 4096 байтов, а затем еще около 500.

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

Я проверил загруженный файл; он составляет 13 мб при сжатии и содержит один XML-файл. Я вручную распаковал XML-файл,и все содержимое там. Но когда я делаю это с помощью этого кода, он выводит только самое начало XML-файла.

кто-нибудь есть идеи, почему это может произойти?

4 ответов


редактировать

попробуйте не оставлять GZipStream открытым:

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

или

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

в итоге я использовал исполняемый файл gzip для декомпрессии вместо GZipStream. Он не может обработать файл, а исполняемый файл.


то же самое случилось со мной. В моем случае только читает до 6 строк, а затем достиг конца файла. Поэтому я понял, что, хотя расширение GZ, оно было сжато другим алгоритмом, не поддерживаемым GZipStream. Поэтому я использовал SevenZipSharp библиотеки и это сработало. Это мой код

вы можете использовать библиотеку SevenZipSharp

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

        }
    }
} 

ты называешь Close или Flush on fileOutput? (Или просто оберните его в using, что является рекомендуемой практикой.) Если вы этого не сделаете, файл не может быть сброшен на диск, когда ваша программа заканчивается.