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