尝试将文件提取到指定文件夹,忽略压缩文件中的路径,但似乎没有方法可以实现。
考虑到其中实现的所有其他好东西,这似乎是一个相当基本的要求。
我错过了什么?
代码如下 -
using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ExtractAll(appPath);
}
尝试将文件提取到指定文件夹,忽略压缩文件中的路径,但似乎没有方法可以实现。
考虑到其中实现的所有其他好东西,这似乎是一个相当基本的要求。
我错过了什么?
代码如下 -
using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ExtractAll(appPath);
}
虽然您无法为特定的Extract()
或ExtractAll()
调用指定它,但ZipFile
类有一个FlattenFoldersOnExtract
字段。当设置为true时,它会将所有提取的文件平铺到一个文件夹中:
var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ToList().ForEach(entry =>
{
entry.FileName = System.IO.Path.GetFileName(entry.FileName);
entry.Extract(appPath);
});
}
zf.ToList().ForEach(entry => {...})
而不是foreach (var entry in zf.Entries){}
?它们之间有什么区别吗? - Joel Peltonenusing (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);
}
}
}
如果有两个文件具有相同的文件名,那么这将失败。例如: files\additionalfiles\file1.txt temp\file1.txt
第一个文件将在压缩文件中重命名为file1.txt,当尝试重命名第二个文件时,会抛出异常,指示已经存在具有相同键的项。