Запись в поток сжатия не поддерживается. Используя Системы.ИО.Gzipstream представляется
Я получаю исключение при попытке распаковки (.GZ) файл с использованием класса GZipStream, включенного в .NET framework. Я использую документацию MSDN. Это исключение:
запись в поток сжатия не поддерживается.
вот источник приложения:
try
{
var infile = new FileStream(@"C:TarDecompTarDecompTarDecompbinDebugnick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[infile.Length];
// Read the file to ensure it is readable.
int count = infile.Read(buffer, 0, buffer.Length);
if (count != buffer.Length)
{
infile.Close();
Console.WriteLine("Test Failed: Unable to read data from file");
return;
}
infile.Close();
MemoryStream ms = new MemoryStream();
// Use the newly created memory stream for the compressed data.
GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress, true);
Console.WriteLine("Decompression");
compressedzipStream.Write(buffer, 0, buffer.Length); //<<Throws error here
// Close the stream.
compressedzipStream.Close();
Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);
} catch {...}
исключение создается в compressedZipStream.писать.)(
какие идеи? О чем говорит мне это исключение?
3 ответов
Он говорит вам, что вы должны позвонить Read
вместо Write
так как это декомпрессия! Также поток памяти должен быть построен с данными, или, скорее, вы должны передать поток файлов непосредственно конструктору GZipStream.
пример того, как это должно было быть сделано (не пытались скомпилировать его):
Stream inFile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read);
Stream decodedStream = new MemoryStream();
byte[] buffer = new byte[4096];
using (Stream inGzipStream = new GZipStream(inFile, CompressionMode.Decompress))
{
int bytesRead;
while ((bytesRead = inGzipStream.Read(buffer, 0, buffer.Length)) > 0)
decodedStream.Write(buffer, 0, bytesRead);
}
// Now decodedStream contains the decoded data
код сжатия не работает как шифрование - вы не можете распаковывать из одного потока в другой, записывая сжатые данные. Вы должны предоставить поток, который уже содержит сжатые данные, и пусть GZipStream
читать из него. Что-то вроде этого:--5-->
using (Stream file = File.OpenRead(filename))
using (Stream gzip = new GZipStream(file, CompressionMode.Decompress))
using (Stream memoryStream = new MemoryStream())
{
CopyStream(gzip, memoryStream);
return memoryStream.ToArray();
}
CopyStream
Это простой метод утилиты для чтения из одного потока и копирования всех данных в другой. Что-то вроде этого:--5-->
static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
Как работают потоки сжатия может быть озадачивающим на первый взгляд.
чтение сжатый данные и запись занимает несжатый данные. В целом, поток гарантирует, что вы всегда" видите " несжатые данные.
правильный способ достичь того, что вы пытаетесь сделать, - читать с помощью GZipStream
а затем напишите с помощью GZipStream
также.