使用 DeflateStream 压缩大文件

问题描述 投票:0回答:1

我正在尝试编写 zipstream 压缩工具,例如从第 3 方服务获取数据,对其进行转换、压缩,然后将这些字节添加到 zip 存档字节流中并发送到另一个服务。
Crc32 在每个块之后重新计算。

制作了第 3 方服务模拟 - 按块读取文件。
这个版本有效,但解压后我得到空文件。但它不是空的 - 我在十六进制编辑器中看到数据。我认为 crc32 有问题。
但如果我一次压缩整个文件,它就可以正常工作。
这是我的问题。 是否可以使用 deflatestream 按块压缩大量数据? 稍后我需要使用常规 zip 工具提取这些数据。

public async Task<byte[]> Compress(string fileName, IAsyncEnumerable<byte[]> data)
{
    var crc32Helper = new System.IO.Hashing.Crc32();
    var lfh = ZipTools.GetLocalFileHeaderEntry(fileName);
    testResult.AddRange(lfh);
    var bytearray = new List<byte>();
    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();
  }
c# zip
1个回答
0
投票

您可以尝试调整 zipflow 中的 C 代码以在您的 C# 应用程序中使用。 zipflow 接收数据块并输出 zip 文件,而无需将任何条目的完整输入或输出 zip 文件保留在内存或文件系统中。

我不知道“ZipTools”是什么,也找不到它。但是,将多个 deflate 流写入单个条目将不起作用。它必须是单个放气流。此外,没有证据表明写入了中央目录结束记录,该记录必须遵循中央目录。

© www.soinside.com 2019 - 2024. All rights reserved.