11

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

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

我错过了什么?

代码是 -

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

4 回答 4

24

虽然您不能为对Extract()or的特定调用指定它ExtractAll(),但ZipFile该类有一个FlattenFoldersOnExtract字段。当设置为 true 时,它​​将所有提取的文件压缩到一个文件夹中:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract;
zip.FlattenFoldersOnExtract = true;
zip.ExtractAll();
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
于 2012-02-20T03:33:34.487 回答
15

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

using (var zf = Ionic.Zip.ZipFile.Read(zipPath))
{
    zf.ToList().ForEach(entry =>
    {
        entry.FileName = System.IO.Path.GetFileName(entry.FileName);
        entry.Extract(appPath);
    });
}
于 2010-03-09T20:56:05.510 回答
2

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

例子:

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);
        }
     }
}
于 2016-08-29T07:43:28.863 回答
1

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

第一个文件将在 zip 文件中重命名为 file1.txt,当尝试重命名第二个文件时,会引发异常,指出已存在具有相同密钥的项目

于 2012-01-04T15:55:54.270 回答