DotNetZip:如何提取文件,但忽略zipfile中的路径?

试图将文件提取到给定的文件夹,忽略zipfile中的路径,但似乎没有办法。

考虑到其中实现的所有其他好东西,这似乎是一个相当基本的要求。

我错过了什么?

代码是 –

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath)) { zf.ExtractAll(appPath); } 

您需要在解压缩之前删除文件名的目录部分…

 using (var zf = Ionic.Zip.ZipFile.Read(zipPath)) { zf.ToList().ForEach(entry => { entry.FileName = System.IO.Path.GetFileName(entry.FileName); entry.Extract(appPath); }); } 

虽然您无法为Extract()ExtractAll()的特定调用指定它,但ZipFile类具有FlattenFoldersOnExtract字段。 设置为true时,它会将所有提取的文件展平为一个文件夹:

 var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract; zip.FlattenFoldersOnExtract = true; zip.ExtractAll(); zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; 

如果有2个文件具有相同的文件名,则会失败。 例如files \ additionalfiles \ file1.txt temp \ file1.txt

第一个文件将被重命名为zip文件中的file1.txt,当第二个文件尝试重命名时,会抛出一个exception,表示已存在具有相同键的项目

您可以使用将流作为参数的重载。 通过这种方式,您可以完全控制将文件提取到的路径。

例:

 using (ZipFile zip = new ZipFile(ZipPath)) { foreach (ZipEntry e in zip) { string newPath = Path.Combine(FolderToExtractTo, e.FileName); if (e.IsDirectory) { Directory.CreateDirectory(newPath); } else { using (FileStream stream = new FileStream(newPath, FileMode.Create)) e.Extract(stream); } } }