GZipStream не читает весь файл - PullRequest
8 голосов
/ 18 июня 2010

У меня есть код, который загружает сжатые файлы и распаковывает их. Проблема в том, что я не могу заставить его распаковать весь файл, он читает только первые 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 ]

4 голосов
/ 18 июня 2010

EDIT

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

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

или

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress);
1 голос
/ 04 октября 2013

То же самое случилось со мной.В моем случае только читает до 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);
            }

        }
    }
} 
1 голос
/ 18 июня 2010

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

0 голосов
/ 18 июня 2010

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

...