Zip条目名称以目录分隔符字符结尾但包含数据

System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath); 

在C#中使用ZipFile,我正在尝试从已知位置提取文件,并且它抛出以下错误:System.IO.Exception:Zip条目名称以目录分隔符字符结尾但包含数据

我做了一些研究,在MSDN中解释了ExtractToDirectory但是找不到这个错误定义。 你能解释为什么会发生这种错误吗?

来自MSDN:

IOExceptionexception

destinationDirectoryName指定的目录已存在。

-要么-

存档中条目的名称为空,仅包含空格,或至少包含一个无效字符。

-要么-

提取存档条目将创建一个位于destinationDirectoryName指定的目录之外的文件。 (例如,如果条目名称包含父目录访问器,则可能会发生这种情况。)

-要么-

要提取的存档条目与已从同一存档中提取的条目具有相同的名称。

我的研究表明,当您使用“Ultra”压缩级别使用7-Zip实用程序压缩文件时,某些存档无法使用.NET System.IO.Compression.ZipFile.ExtractToDirectory()方法解压缩。 错误消息是:Zip条目名称以目录分隔符字符结尾但包含数据。

根据我的观察,只有满足以下3个条件时才会出现此错误:

  1. 目标存档很大 – 500MB +(小档案似乎解压缩很好)。
  2. 存档的根目录只包含文件夹(如果您将至少一个文件添加到存档的根目录,它也会解压缩)。
  3. 使用7-Zip Ultra压缩。

最后我找到了这个7-Zip bug的三个解决方案。

解决方案1 :将至少一个文件添加到存档的根目录(任何虚拟文件或readme.txt文件)。

解决方案2 :使用本机Windows压缩实用程序(选择文件,右键单击,发送到 – >压缩文件夹)。

解决方案3 :不要使用7-Zip Ultra压缩。

所有这些解决方案都解决了我的问题。 选择最适合您项目的项目。

ZipArchive条目以目录分隔符“/”结尾但具有长度!= 0时发生错误

您可以轻松找到这些条目

 zip.Entries.Where(o => o.FullName.EndsWith("/") && o.Length != 0)