ZipArchive中存档模式更新可能出现的错误?

时间:2016-06-13 09:22:05

标签: c# .net zip

如果zip文件包含“目录条目”,我遇到ZipArchiveMode.Update的问题。

我知道没有目录条目这样的东西,但有些工具会为zip文件中的目录生成ZipArchiveEntry.Length = 0ZipArchiveEntry.Name = ""的条目。

以下代码现在破坏了zip文件:

using (ZipArchive archive = ZipFile.Open(@"D:\TEMP\test.zip", ZipArchiveMode.Update))
{
}

正如你所看到的,除了用ZipArchiveMode.Update打开zip文件并最终处理它之外我什么都不做。

问题是“目录条目”似乎被视为文件条目。所以在输出中有新的零字节条目和目录名。

我仍然可以打开zip文件,甚至可以按拖放操作提取文件。但尝试提取zip文件会导致错误消息。也许是因为有两个条目具有相同的全名?

我的解决方法是避免使用ZipArchiveMode.Update并使用临时MemoryStream。然后迭代所有条目,忽略“目录条目”并仅将文件条目复制到流中。这样就有用了。

这是ZipArchive中的错误还是目录条目错误?如果我想在zip中存储空目录怎么办?正如我所说:许多工具似乎产生了这样的目录条目。

1 个答案:

答案 0 :(得分:0)

我在尝试使用目录条目更新 zip 文件时遇到了同样的问题,在更新文件后,zip 文件存在(带有新添加的文件)但已损坏。

最终对我有用的是将 Nuget 引用添加到 DotNetZip 并使用 Ionic.Zip 添加文件:

using (Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(parameters.ObjzfPath)) 
{
    zip.AddEntry("newFileEntry", "newFileContent"); // you can use zip.AddFile("newFile.txt") as well
    zip.Save();
}