2010-02-24 3 views
26

Ich habe eine Funktion, die eine ZIP-Datei und entpacken Sie es in ein Verzeichnis erhalten (ich benutze DotNetZip Bibliothek.)Entpacken Sie eine ZIP-Datei programmgesteuert von DotNetZip-Bibliothek?

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

Meine ZIP-Datei enthält mehrere Dateien und Verzeichnisse. Aber ich möchte nur einige dieser Dateien, nicht alle von ihnen, extrahieren.

Wie kann ich das schaffen?

Antwort

30

Sie müssen jede ZipEntry testen, um zu sehen, ob Sie es entpacken:

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

Es gibt eine ExtractSelectedEntries-Methode in der ZipFile-Klasse. Hier ist die Methodensignatur.

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

So in Ihrem Programm können Sie einfach die angegebenen Dateien extrahieren, indem Sie die selectionCriteria.

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

Sie können Kriterien mit den Konjunktionen UND oder ODER kombinieren. Mit einer Zeichenfolge wie "name = * .txt AND size> = 100k" für die selectionCriteria werden Einträge abgerufen, deren Namen mit .txt enden und deren unkomprimierte Größe größer oder gleich 100 Kilobyte ist.

hier sind einige Kriterien Proben


Kriterien (Dateien abgerufen)

Name! = * .xls (jede Datei mit einer Erweiterung, die nicht .xls ist)

Name = * .mp3 (jede Datei mit der Erweiterung .mp3)

* .mp3 (wie oben, jede Datei mit der Endung .mp3)

Attribute = A (alle Dateien, deren Attribute sind das Archiv Bit)

Attribute! = H (alle Dateien, deren Attribute beinhalten nicht die versteckte Bit)

mtime> 2009-01-01 (alle Dateien mit einem letzten Änderung nach dem 1. Januar 2009)

Größe> 2 GB (alle Dateien, deren unkomprimierten Größe größer als 2 GB)


weitere Referenz, Sie sho Lesen Sie das API-Dokument allein mit der Bibliothek.

+1

Verwendung von ExtractSelectedEntries mit mehreren Kriterien. Ich brauche es für alle Bildformate (jpg, png, gif, jpeg). Wie es geht? –

12

Sie können auch LINQ verwenden, um auszuwählen, welche Einträge Sie extrahieren möchten. Zum Beispiel:

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); 
} 

Natürlich können Sie, was Abfragekriterien Sie in der where Klausel wollen verwenden.

Verwandte Themen