4

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 的奇怪之处。好吧,或者我误解了一些东西:)

4

1 回答 1

6

GetBuffer肯定是错的。它返回 的内部缓冲区,MemoryStream通常比实际内容大。

要返回仅包含实际内容的数组,请使用ToArray().

或者您可以小心处理消费代码中未完全填充的缓冲区。这将减少 GC 压力,因为您不需要为返回值分配一个全新的数组。

如果 zip-archive 很大,我也会考虑直接保存到文件中,而不是在内存中组装存档。

于 2012-04-24T07:09:30.503 回答