通过DotNetZip库以编程方式提取ZIP文件?

时间:2010-02-24 08:39:01

标签: c# zip extract dotnetzip

我有一个获取ZIP文件并将其解压缩到目录的函数 (我使用DotNetZip库。)

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}

我的ZIP文件包含多个文件和目录。但我只想提取 其中一些文件,而不是所有文件。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:38)

您需要测试每个ZipEntry以查看是否要提取它:

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
      foreach (ZipEntry e in zip)
      {
        // check if you want to extract e or not
        if(e.FileName == "TheFileToExtract") 
          e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently);
      }
}

ZipFile zip = ZipFile.Read(zipFileName); //Runs in framework 4.5

答案 1 :(得分:21)

ZipFile类中有一个ExtractSelectedEntries方法。这是方法签名。

public void ExtractSelectedEntries(string selectionCriteria, string directoryPathInArchive, string extractDirectory, ExtractExistingFileAction extractExistingFile)

因此,在您的程序中,您可以通过提供selectionCriteria来简单地提取指定的文件。

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     zip.ExtractSelectedEntries("name = *.doc", "document\", outputDirectory, ExtractExistingFileAction.OverwriteSilently);
}

您可以将条件与连词AND或OR组合。对selectionCriteria使用类似“name = * .txt AND size> = 100k”的字符串检索名称以.txt结尾且未压缩大小大于或等于100千字节的条目。

这里有一些标准样本


条件(已检索的文件)

name!= * .xls(任何扩展名不是.xls的文件)​​

name = * .mp3(任何扩展名为.mp3的文件)

* .mp3(与上述相同,任何扩展名为.mp3的文件)

attributes = A(其属性包含Archive位的所有文件)

attributes!= H(其属性不包含隐藏位的所有文件)

mtime> 2009-01-01(2009年1月1日之后最后修改时间的所有文件)

尺寸> 2gb(所有未压缩大小超过2GB的文件)


如需更多参考,您应该单独阅读API文档。

答案 2 :(得分:13)

您还可以使用LINQ选择要提取的条目。例如:

using (var zip = ZipFile.Read(ArchiveToRead))
{
    var selection = from e in zip.Entries
        where System.IO.Path.GetFileName(e.FileName).StartsWith("C")
        select e;

    foreach (var e in selection)
        e.Extract(extractDir);
}

当然,您可以在where子句中使用您想要的任何查询条件。