尝试将文件提取到给定文件夹,忽略 zipfile 中的路径,但似乎没有办法。
考虑到那里实现的所有其他好东西,这似乎是一个相当基本的要求。
我错过了什么?
代码是 -
using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath))
{
zf.ExtractAll(appPath);
}
虽然您不能为对Extract()
or的特定调用指定它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);
});
}
您可以使用将流作为参数的重载。通过这种方式,您可以完全控制文件将被提取到的路径。
例子:
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);
}
}
}
如果有 2 个文件名相同的文件,那将失败。例如 files\additionalfiles\file1.txt temp\file1.txt
第一个文件将在 zip 文件中重命名为 file1.txt,当尝试重命名第二个文件时,会引发异常,指出已存在具有相同密钥的项目