如何分阶段创建zip文件?

How to create zip file in stages?

我正在通过以下方式将数据写入 ZIP 文件:

    private static void ZipStringToFile(string value)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            using (GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true))
            {
                byte[] queryData = _encUtf8.GetBytes(value);
                compressedzipStream.Write(queryData, 0, queryData.Length);
                compressedzipStream.Write(_dataEndOfLine, 0, _dataEndOfLine.Length);
            }
            using (FileStream outfile = new FileStream("TestZip.zip", FileMode.Append))
            {
                byte[] buffer2 = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(buffer2, 0, buffer2.Length);
                outfile.Write(buffer2, 0, buffer2.Length);
            }
        }
    }

效果很好。但是如果我再次使用相同的方法:

        ZipStringToFile("String #1");
        ZipStringToFile("\r\n");
        ZipStringToFile("String #2");

我有更大的 zip 文件(所以我相信文件包含两个字符串),但在使用 "TotalCommander" 嵌入式存档程序解压缩后我只看到 "String #2".

我认为 zip 文件本身的结构不允许 "appending" 所以我的方法主要有错误。

我是否应该先将所有内容序列化到文件中,然后在最后压缩?或者有将数据附加到 zip 存档的正确方法吗?

谢谢。

如果您使用的是 ASP.NET ZipArchive 库,我的建议是尝试:

  1. 检查 zip 是否存在
  2. 如果存在,打开它。
  3. 使用GetEntry函数打开现有存档条目
  4. 打开()流的入口,然后将新数据写入流
  5. 将存档保存回磁盘。

否则您每次都可能覆盖现有存档。

您使用的术语 "zip" 不正确。 gzip 不是 zip。 gzip 是一种用于单个流的压缩数据格式。 zip 是多个文件的存档格式。您正在生成 gzip 流。

可以连接 gzip 流以生成更大的有效 gzip 流。兼容的 gzip 解码器应该传送来自串联流的所有数据。因此,要么您没有正确连接它们,要么您没有将连接结果正确地传递给 "TotalCommander",或者 "TotalCommander" 不是兼容的 gzip 解码器。

Should I just implement serializing everything into file first and zip IN THE END?

总的来说,是的,你应该。原因是如果你只提供 gzip 小字符串,你会得到糟糕的压缩。为了获得良好的压缩效果,您需要为 gzip 提供更多数据才能使用。