【问题标题】:Extract a ZIP file programmatically by DotNetZip library?通过 DotNetZip 库以编程方式提取 ZIP 文件?
【发布时间】:2010-02-24 08:39:00
【问题描述】:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

    标签: c# zip extract dotnetzip


    【解决方案1】:

    你需要对每个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);
          }
    }
    

    【讨论】:

      【解决方案2】:

      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 日之后的所有文件)

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


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

      【讨论】:

      • 如何使用具有多个条件的 ExtractSelectedEntries。我需要它用于所有图像格式(jpg,png,gif,jpeg)。怎么办?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 2011-09-11
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多