C# 中的 ZIP 文件意外结束存档

Unexpected end of archive on a ZIP file in c#

我正在尝试压缩一个文本文件并在控制台应用程序中将其拆分为块 (byte[])。

public List<byte[]> CreateChunks(string fileName, string txtFilePath)
    {
        long chunkSize = 100 * 1000;//100kb
        var fileChunks = new List<byte[]>();

        using (var memoryStream = new MemoryStream())
        {
            using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, false))
            {
                zipArchive.CreateEntryFromFile($"{txtFilePath}", fileName, CompressionLevel.Optimal);

                memoryStream.Position = 0;

                var buffer = new byte[chunkSize];

                while (memoryStream.Read(buffer, 0, buffer.Length) > 0)
                {
                    fileChunks.Add(buffer);
                }
            }
        }
        return fileChunks;
    }

使用这些块,我正在尝试在另一个应用程序中创建一个 zip 文件。

    public void JoinChunks(List<byte[]> fileChunks, string filePath)
    {
        var memory = new MemoryStream();
        using (var file = new FileStream(filePath + "\temp.zip", FileMode.Create))
        {
            foreach (var item in fileChunks)
            {
                memory.Write(item, 0, item.Length);
            }
            memory.WriteTo(file);
            file.Close();
        }
    }

查看创建的 zip 文件时,弹出错误消息 意外结束存档

如果我尝试分块文本文件并将它们连接回去,那么它工作正常。问题出在 ZIP 中。欢迎任何解决方案。

您需要在对数据执行任何其他操作之前关闭存档,以便存档对象可以刷新剩余数据并完成存档。您的代码应如下所示:

using (var memoryStream = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, false))
    {
        zipArchive.CreateEntryFromFile($"{txtFilePath}", fileName, CompressionLevel.Optimal);
    }

    memoryStream.Position = 0;

    var buffer = new byte[chunkSize];

    while (memoryStream.Read(buffer, 0, buffer.Length) > 0)
    {
        fileChunks.Add(buffer);
    }
}

即将非归档相关代码移出 zipArchive 对象的 using 语句。