如何使用C#DotNetZip提取SubDirectory?

时间:2013-03-28 03:17:21

标签: c# extract subdirectory dotnetzip

我的MyFile.zip有一个主目录“MyMainFolder”,里面有几个SubDirectories,其中一个我要提取(MySubFolder)...及其所有的子目录和内容。

我正在试图找出如何“进入”MyMainFolder,以便我可以提取'MySubFolder'。

我有一些代码可以提取文件夹,只要我要查找的文件夹作为zip中的主文件夹存在...我可以检测主文件夹是否被称为“MyMainFolder”,所以它知道看起来在那里并从那里提取,而不是在MySubFolder的主zip根中查找。)

using (ZipFile zip1 = ZipFile.Read(fileName))
{
    zipFile = ZipFile.Read(@""+fileName);
    var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));

   if (result == false)
   {
            MessageBox.Show("MyMainFolder detected....Extracting from MyMainFolder...");
            // something here that will extract JUST MySubFolder and contents
   } else {
    foreach (var e in selection)
   {             
           var selection = (from e in zip1.Entries where (e.FileName).Contains("NySubfolder") select e)               
           e.Extract(outputDirectory);        
   }
  }
}

到目前为止,我已尝试在if-else的每个部分内部单独使用,我尝试创建一个单独的selectionX,我试图强制使用根文件夹名称(对于此,它将永远是'MyMainFolder'实验)成为它看起来的一部分,以为我可以提取MySubFolder,但我也无法让它工作。我试图在stackflow和elsehwere中找到我发现的其他几种方法,比如使用“如何提取文件,但忽略zipfile中的路径”和其他此类帖子的部分尝试找到一种方法来“跳过”该主根提取时的文件夹。 (这样它只能获取'MySubFolder'(和内容)并提取到outputDirectory(而不是MyMainFolder \ MySubFolder ......)

感谢任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:1)

列举整个内容,直到我遇到我想要的东西,但作为一个实验,我想看看是否可以用另一种方式完成。

由于我无法检查根文件夹中子文件夹的名称,我认为我可以匹配我正在查找的内容,因为我正在解析它,只提取我想要的内容,然后只需更改输出路径。

using (ZipFile zip1 = ZipFile.Read(fileName))
{
    zipFile = ZipFile.Read(@""+fileName);
    var result = zipFile.Any(entry => entry.FileName.Contains("MySubFolder"));

    if (result == false)
    {
        // something here that will extract JUST MySubFolder and content
        string TestX = Path.GetDirectoryName(e.FileName) ;
        string MyNewPath = outputDirectory+@"\"+TestX ;
        e.Extract(MyNewPath);
    } else {
        foreach (var e in selection)
   {             
        var selection = (from e in zip1.Entries where (e.FileName).Contains("MySubfolder")
        .select e)               
        e.Extract(outputDirectory);        
   }
}

那样的东西...... 不是很有用,但有趣并且帮助我学习了一点。 (如果没有别的,一个如何不做事情的例子......呵呵) 感谢