2010-02-24 6 views
26

que tienen una función que obtener un archivo ZIP y extraer a un directorio (I utilizar DotNetZip biblioteca.)¿Extrae un archivo ZIP programáticamente mediante la biblioteca DotNetZip?

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

Mi archivo ZIP contiene varios archivos y directorios. Pero quiero extraer solo algunos de estos archivos, no todos.

¿Cómo puedo hacer esto?

Respuesta

30

necesita probar cada ZipEntry para ver si desea extraerlo:

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

Hay un método ExtractSelectedEntries en la clase ZipFile. aquí está la firma del método.

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

Así que en su programa, puede simplemente extraer los archivos especificados al proporcionar la selecciónCriteria.

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

Puede combinar criterios con las conjunciones AND u OR. Usando una cadena como "name = * .txt AND size> = 100k" para selectionCriteria recupera las entradas cuyos nombres terminan en .txt, y cuyo tamaño no comprimido es mayor o igual que 100 kilobytes.

He aquí algunos ejemplos de criterios


criterios (archivos recuperados)

nombre! = * .xls (cualquier archivo con una extensión que no es .xls)

nombre = * .mp3 (cualquier archivo con una extensión .mp3)

* .mp3 (igual que el anterior, cualquier archivo con una extensión .mp3)

atributos = A (todos los archivos cuyos atributos incluyen el bit de archivo)

atributos! = H (todos los archivos cuyos atributos no incluyen el bit oculto)

-mtime> 2009-01-01 (todos archivos con una última vez después del 1 de enero de modificación del 2009)

tamaño> 2 GB (todos los archivos cuyo tamaño no comprimido es mayor que 2 GB)


Para mayor referencia, Sho uld lee el documento API solo con la biblioteca.

+1

Cómo usar ExtractSelectedEntries con múltiples criterios. Lo necesito para todos los formatos de imagen (jpg, png, gif, jpeg). ¿Cómo hacerlo? –

12

También puede usar LINQ para seleccionar las entradas que desea extraer. Por ejemplo:

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

Por supuesto se puede utilizar cualquier criterio consulta que desea en la cláusula where.

Cuestiones relacionadas