Запись в поток сжатия не поддерживается. Использование Системы. IO.GZipStream

Это - сервер DNS, и это присвоило бы IP-адреса машинам, которые запрашивают их от Вашего компьютера. В этом случае это использовалось бы NetworkManager для совместного использования интернет-соединения. Ничто для волнения о :)

7
задан ono2012 3 July 2018 в 12:20
поделиться

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
16
ответ дан 6 December 2019 в 06:50
поделиться

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

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

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);
    }
}
9
ответ дан 6 December 2019 в 06:50
поделиться

Поначалу может быть непонятно, как работают потоки сжатия.

Чтение требует сжатых данных, а запись - несжатых данных. В общем, поток гарантирует, что вы всегда будете "видеть" несжатые данные.

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

1
ответ дан 6 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: