34

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

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

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

我怎样才能使这项工作?

4

3 回答 3

44

您需要测试每个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);
      }
}
于 2010-02-24T08:42:54.440 回答
20

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 KB 的条目。

这是一些标准样本


标准(检索到的文件)

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

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

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

attributes = A(属性包含存档位的所有文件)

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

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

大小 > 2gb(所有未压缩大小大于 2gb 的文件)


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

于 2010-02-25T08:28:12.153 回答
14

您还可以使用 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子句中使用您想要的任何查询条件。

于 2010-02-26T02:32:06.940 回答