【问题标题】:Possible bug in ZipArchive with archive mode update?ZipArchive 中可能存在存档模式更新的错误?
【发布时间】:2021-01-05 23:23:40
【问题描述】:

如果 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 中存储空目录怎么办?正如我所说:许多工具似乎都可以生成这样的目录条目。

【问题讨论】:

    标签: c# .net zip


    【解决方案1】:

    我在尝试使用目录条目更新 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2011-04-17
      • 2019-03-26
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 2013-10-11
      相关资源
      最近更新 更多