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

时间:2014-07-24 18:52:25

标签: c# exception extraction zipfile

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

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

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

来自MSDN:

IOException

  

destinationDirectoryName指定的目录已存在。

-OR -

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

-OR -

  

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

-OR -

  

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

3 个答案:

答案 0 :(得分:5)

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

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

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

  4. 最后,我发现了这个7-Zip错误的三个解决方案。

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

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

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

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

答案 1 :(得分:1)

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

您可以使用

轻松找到这些条目
zip.Entries.Where(o => o.FullName.EndsWith("/") && o.Length != 0)

答案 2 :(得分:0)

我在为这个问题而苦苦挣扎,甚至一些像sharpZip这样的包也不起作用。 (TeamCity 和artefact zip 包中出现问题)

使用 SharpCompress(https://www.nuget.org/packages/sharpcompress/) 结束这个解决方案

var archive = ArchiveFactory.Open(model.UserParams.PathToZipFile.FullName);

foreach (var entry in archive.Entries)
{
  if (entry.IsDirectory == false)
  {
   entry.WriteToDirectory(unZipDirectory, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true });
  }
}