2010-02-24 83 views
26

我有得到一個ZIP文件並解壓到一個目錄 功能(我用DotNetZip庫)。通過DotNetZip庫以編程方式提取ZIP文件?

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

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

我該如何做這項工作?

回答

30

你需要測試每個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 
19

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千字節的條目。

這裏有一些標準樣品


標準(文件檢索)

名字!=的* .xls

名字(任意的擴展名,不.xls文件) = * .mp3(任何擴展名爲.mp3的文件)

* .mp3(與上面相同,任何擴展名爲.mp3的文件)

屬性= A(其屬性包括存檔位的所有文件)

屬性!= H(所有文件其屬性不包括隱藏位)

的mtime> 2009-01-01(全與1月1日之後,2009年最後修改時間)

尺寸> 2GB的文件(所有文件,其未壓縮的大小大於2GB)


更多的參考,你笑只能用庫來讀取API文檔。

+1

如何在多個條件下使用ExtractSelectedEntries。我需要它的所有圖像格式(JPG,PNG,GIF,JPEG)。怎麼做? – 2012-12-24 12:34:04

12

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

相關問題