2010-03-09 9 views
8

tratar de extraer los archivos a una carpeta determinada haciendo caso omiso de la ruta en el archivo zip, pero no parece ser una forma.DotNetZip: ¿Cómo extraer los archivos, pero haciendo caso omiso de la ruta en el archivo zip?

Esto parece un requisito bastante básico dado todo el otras cosas buenas implementado en ese país.

¿Qué me falta? código

es -

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ExtractAll(appPath); 
} 
+0

Busco una solución similar, pero me gustaría quitar sólo el primer paso de todos los archivos contenidos ... por ejemplo,/mi solución/archivo/file1.txt se convierte en/archivo/archivo1.txt. ¿Algún recurso para esto? – atwellpub

Respuesta

12

Usted tendrá que quitar la parte del directorio del nombre de archivo justo antes de descomprimir ...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ToList().ForEach(entry => 
    { 
     entry.FileName = System.IO.Path.GetFileName(entry.FileName); 
     entry.Extract(appPath); 
    }); 
} 
+0

doh! no pensé en eso :) muchas gracias – Kumar

+0

Me sale un error que dice "Propiedad o indizador es de solo lectura" ... ¡Ayuda! – pek

+0

¿Funciona esto con directorios anidados? –

1

que pueden fallar si hay 2 archivos con igual nombres de archivo Por ejemplo archivos \ additionalfiles \ file1.txt temp \ file1.txt

primer archivo será renombrado a file1.txt en el archivo zip y cuando el segundo archivo está tratando de cambiar el nombre se emite una excepción diciendo que una elemento con la misma clave ya existe

18

Si bien no se puede especificar para una llamada específica a Extract() o ExtractAll(), la clase ZipFile tiene un campo FlattenFoldersOnExtract. Cuando se establece en verdadero, aplana todos los archivos extraídos en una carpeta:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract; 
zip.FlattenFoldersOnExtract = true; 
zip.ExtractAll(); 
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; 
+4

Esta debería ser la respuesta aceptada ([DontNetZip doc] (http://dotnetzip.herobo.com/DNZHelp/html/4970c6e8-c169-3ecc-b5f2-8ba9b354c51d.htm)). La otra respuesta es una solución: se cambia el nombre del archivo dentro de la postal antes de extraerlo. –

0

Puede usar la sobrecarga que toma una secuencia como parámetro. De esta forma, tienes control total de la ruta donde se extraerán los archivos.

Ejemplo:

using (ZipFile zip = new ZipFile(ZipPath)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
     string newPath = Path.Combine(FolderToExtractTo, e.FileName); 

     if (e.IsDirectory) 
     { 
      Directory.CreateDirectory(newPath); 
     } 
     else 
     { 
      using (FileStream stream = new FileStream(newPath, FileMode.Create)) 
      e.Extract(stream); 
     } 
    } 
} 
Cuestiones relacionadas