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); } } }