Сжатие больших файлов с использованием DeflateStreamC#

Место общения программистов C#
Ответить
Anonymous
 Сжатие больших файлов с использованием DeflateStream

Сообщение Anonymous »

Я пытаюсь написать инструмент сжатия zipstream, например получать данные из стороннего сервиса, преобразовывать их, сжимать, а затем добавлять эти байты в поток байтов zip-архива и отправлять в другой сервис.

Crc32 пересчитывается после каждого фрагмента.
Сделана эмуляция стороннего сервиса - чтение файла по частям.

Эта версия работает, но после извлечения я получаю пустой файл. Но он не пустой — я вижу данные в шестнадцатеричном редакторе. Я думаю, что-то есть с crc32.

Но если я сжимаю весь файл сразу, все работает нормально.

Вот мой вопрос.
Это так? можно ли сжимать большие объемы данных по частям с помощью deflatestream?
Мне нужно будет извлечь эти данные позже с помощью обычных инструментов zip.
public async Task Compress(string fileName, IAsyncEnumerable data)
{
var crc32Helper = new System.IO.Hashing.Crc32();
var lfh = ZipTools.GetLocalFileHeaderEntry(fileName);
testResult.AddRange(lfh);
var bytearray = new List();
await foreach (var chunk in data)
{
_originalSize += (ulong) chunk.Length;
var compressedData = Compress(chunk);
_compressedSize += (ulong) compressedData.Length;
crc32Helper.Append(chunk);
testResult.AddRange(compressedData);
}
_originalSize += (ulong) bytearray.Count;

_crc32 = crc32Helper.GetCurrentHashAsUInt32();
var cd = ZipTools.GetCentralDirectoryEntry(
fileName,
_crc32,
(ulong) lfh.Length + _compressedSize,
_compressedSize,
_originalSize);
testResult.AddRange(cd);
return testResult.ToArray();
}

public byte[] Compress(byte[] data)
{
using var input = new MemoryStream(data);
using var resultStream = new MemoryStream();
using (DeflateStream compressionStream = new DeflateStream(resultStream, CompressionMode.Compress))
{
input.CopyTo(compressionStream);
}

return resultStream.ToArray();
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... latestream
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»