2010-02-24 19 views
26

Mam funkcji, które pobrać plik ZIP i rozpakuj go do katalogu (używam DotNetZip bibliotekę.)Wyodrębnij plik ZIP programowo z biblioteki DotNetZip?

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

Mój plik ZIP zawiera wiele plików i katalogów. Ale chcę wyodrębnić tylko niektóre z tych plików, nie wszystkie.

Jak mogę to ułatwić?

Odpowiedz

30

Trzeba przetestować każdy ZipEntry aby zobaczyć, czy chcesz go rozpakować:

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

Istnieje metoda ExtractSelectedEntries w klasie ZipFile. oto podpis metody.

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

W twoim programie możesz po prostu wyodrębnić określone pliki, podając kryteria selectionCriteria.

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

Możesz łączyć kryteria ze spójnikami AND lub OR. Używanie łańcucha typu "name = * .txt ORAZ size> = 100k" dla kryterium selectionCriteria pobiera wpisy, których nazwy kończą się na .txt i których rozmiar nieskompresowany jest większy lub równy 100 kilobajtów.

oto kilka próbek Kryteria


kryteria (Pliki pobierane)

imię! = * .xls (dowolny plik z rozszerzeniem, które nie jest .xls)

nazwy = * .mp3 (dowolny plik z rozszerzeniem .mp3)

* .mp3 (taki sam jak powyżej, dowolny plik z rozszerzeniem .mp3)

atrybuty = A (wszystkie pliki, których atrybuty zawierają bitu archiwum)

atrybuty! = H (wszystkie pliki, których atrybuty nie zawierają ukryte bit)

mtime> 2009-01-01 (całość pliki z ostatniej modyfikacji czasu po 1 stycznia 2009 roku)

rozmiar> 2GB (wszystkie pliki, których nieskompresowany rozmiar jest większy niż 2 GB)


Dalsze odniesienia, ty SHO Czytałeś sam dokument API z biblioteką.

+1

Jak korzystać z ExtractSelectedEntries z wieloma kryteriami. Potrzebuję go do wszystkich formatów graficznych (jpg, png, gif, jpeg). Jak to zrobić? –

12

Możesz także użyć LINQ, aby wybrać pozycje, które chcesz wyodrębnić. Na przykład:

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

oczywiście można wykorzystać cokolwiek chcesz kryteria kwerendy w klauzuli where.

Powiązane problemy