System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
在C#中使用ZipFile,我正在尝试从已知位置提取文件,并且它抛出以下错误: System.IO.Exception:Zip条目名称以目录分隔符结尾,但包含数据
我做了一些研究,在MSDN中解释了ExtractToDirectory但是找不到这个错误定义。你能解释为什么会发生这种错误吗?
来自MSDN:
IOException
destinationDirectoryName指定的目录已存在。
-OR -
存档中条目的名称为空,仅包含空格,或至少包含一个无效字符。
-OR -
提取存档条目会创建一个位于destinationDirectoryName指定的目录之外的文件。 (例如,如果条目名称包含父目录访问器,则可能会发生这种情况。)
-OR -
要提取的存档条目与已从同一存档中提取的条目具有相同的名称。
答案 0 :(得分:5)
我的研究表明,使用" Ultra"压缩文件时使用7-Zip实用程序压缩级别,某些存档无法使用.NET System.IO.Compression.ZipFile.ExtractToDirectory()方法解压缩。 错误消息是:Zip条目名称以目录分隔符结尾,但包含数据。
根据我的观察,只有满足以下3个条件时才会出现此错误:
最后,我发现了这个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 });
}
}