试图提取文件给定文件夹忽略了压缩文件的路径,但似乎没有成为一个方式。

这似乎是一个相当基本的要求给予所有在那里实施了其他好东西。

我错过什么?

代码为 -

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个文件的文件名等于这将失败。例如 文件\ additionalfiles \ FILE1.TXT TEMP \ FILE1.TXT

第一个文件将被重新命名zip文件到FILE1.TXT并在第二个文件是试图改名抛出一个异常说,使用相同的密钥的项目已经存在

可以使用采用一个流作为参数的过载。通过这种方式,你有路径的全面控制,其中的文件将被提取到。

示例:

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);
        }
     }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top