DotNetZip创建损坏的档案(错误的CRC)

Hek*_*eki 4 c# zip checksum dotnetzip

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();
Run Code Online (Sandbox Code Playgroud)

我需要添加修改时间,这是非常关键的,但是现在我只有一个虚拟时间戳.

当我用WinRAR打开文件时,它会显示"意外的归档结束".每个单独的文件都有校验和00000000,WinRAR说"存档格式未知或已损坏".我可以修理它,它可以减少20%的尺寸并使一切正常.但这并不是真的有用..

当我在添加所有条目后创建断点时,我可以看到zip.Entries所有条目都具有相同的错误CRC,但所有数据似乎都存在.所以它不应该是我保存存档的问题.

我在其他地方使用我的文件集没有问题,这增加了DotNetZip很奇怪.好吧,或者我误解了一些东西:)

Cod*_*aos 6

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

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

或者您可以在消费代码中仔细处理未完全填充的缓冲区.这会降低GC压力,因为您不需要为返回值分配一个全新的数组.

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