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

时间:2010-03-09 00:16:43

标签: c# zip dotnetzip

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

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

我缺少什么?

代码是 -

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

4 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:1)

如果有2个文件具有相同的文件名,则会失败。例如 文件\ additionalfiles \ FILE1.TXT TEMP \ FILE1.TXT

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

答案 3 :(得分:0)

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

示例:

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