DotNetZip存在一个奇怪的问题,我似乎无法找到解决方案。 我现在已经搜索了几个小时,但我找不到任何关于此的内容,所以这里就是。
var ms = new MemoryStream();
using (var archive = new Ionic.Zip.ZipFile()) {
foreach (var file in files) {
// string byte[]
var entry = archive.AddEntry(file.Name, file.Data);
entry.ModifiedTime = DateTime.Now.AddYears(10); // Just for testing
}
archive.Save(ms);
}
return ms.GetBuffer();
我需要添加修改时间,这是非常重要的,但是现在我只是有一个虚拟时间戳。
当我用WinRAR打开文件时,它会显示“意外的归档结束”。每个单独的文件都有校验和00000000,WinRAR说“存档格式未知或已损坏”。我可以修理它,它可以减少20%的尺寸并使一切正常。但这并不是真的有用..
当我在添加所有条目后创建一个断点时,我可以在zip.Entries
中看到所有条目都有相同的错误CRC,但所有数据似乎都在那里。
所以它不应该是我保存档案的方式。
我在其他地方使用我的文件集没有问题,这增加了DotNetZip很奇怪。好吧,或者我误解了一些事情:)
答案 0 :(得分:6)
GetBuffer
肯定是错的。它返回MemoryStream
的内部缓冲区,通常大于实际内容。
要返回仅包含实际内容的数组,请使用ToArray()
。
或者你可以仔细处理消费代码中未完全填充的缓冲区。这会降低GC压力,因为您不需要为返回值分配一个全新的数组。
如果zip-archive很大,我还会考虑直接保存到文件,而不是在内存中组装存档。