如何分阶段创建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 库,我的建议是尝试:
- 检查 zip 是否存在
- 如果存在,打开它。
- 使用GetEntry函数打开现有存档条目
- 打开()流的入口,然后将新数据写入流
- 将存档保存回磁盘。
否则您每次都可能覆盖现有存档。
您使用的术语 "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 提供更多数据才能使用。
我正在通过以下方式将数据写入 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 库,我的建议是尝试:
- 检查 zip 是否存在
- 如果存在,打开它。
- 使用GetEntry函数打开现有存档条目
- 打开()流的入口,然后将新数据写入流
- 将存档保存回磁盘。
否则您每次都可能覆盖现有存档。
您使用的术语 "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 提供更多数据才能使用。