2008-10-13 14 views
13

Estoy usando el siguiente código, usando la biblioteca SharpZipLib, para agregar archivos a un archivo .zip, pero cada archivo se almacena con su ruta completa. Necesito solo almacenar el archivo, en la 'raíz' del archivo .zip.SharpLibZip: Agregar archivo sin ruta

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file); 
    } 
    zipFile.CommitUpdate(); 
} 

No se puede encontrar nada acerca de una opción para esto en la documentación suministrada. Como esta es una biblioteca muy popular, espero que alguien que lea esto pueda saber algo.

Respuesta

21

Mi solución fue establecer la propiedad NameTransform objeto del ZipFile a un ZipNameTransform con su TrimPrefix establecido en el directorio del archivo. Esto hace que la parte del directorio de los nombres de las entradas, que son rutas completas de archivos, se elimine.

public static void ZipFolderContents(string folderPath, string zipFilePath) 
{ 
    string[] files = Directory.GetFiles(folderPath); 
    using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
    { 
     zipFile.NameTransform = new ZipNameTransform(folderPath); 
     foreach (string file in files) 
     { 
      zipFile.BeginUpdate(); 
      zipFile.Add(file); 
      zipFile.CommitUpdate(); 
     } 
    } 
} 

Lo bueno es propiedad del NameTransform es de tipo INameTransform, permitiendo la personalización del nombre transforma.

+1

Perfecto, esto es exactamente lo que estaba buscando. ¡Gracias! –

+0

Sí, lo mismo aquí, exactamente lo que necesitaba. ¡Gracias! –

+0

Muchas gracias. Después de tanta lucha pude resolver mi problema. – Dilip0165

10

¿Qué le parece usar System.IO.Path.GetFileName() combinado con el parámetro entryName de ZipFile.Add()?

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, System.IO.Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
} 
+1

No hay sobrecarga con un parámetro entryName para ZipFile.Add() al agregar un archivo por nombre, pero me gusta su forma de pensar. Ver mi respuesta a continuación. – ProfK

+2

¿Tiene la última versión de la biblioteca? Tiene una sobrecarga en el archivo.add – rjrapson

+2

Estoy bastante seguro de que hay, al menos en la última versión. –

3

La entrada de MSDN para Directory.GetFiles() establece que Los nombres de los archivos devueltos se añaden al parámetro de ruta suministrado. (http://msdn.microsoft.com/en-us/library/07wt70x2.aspx), por lo que las cadenas que está pasando a zipFile.Add() contienen la ruta.

De acuerdo con la documentación SharpZipLib, hay una sobrecarga del método Add,

public void Add(string fileName, string entryName) 
Parameters: 
    fileName(String) The name of the file to add. 
    entryName (String) The name to use for the ZipEntry on the Zip file created. 

Trate de este enfoque:

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
} 
+1

Sí, si excluye el directorio de la ruta del archivo que está agregando, el método Agregar no encontrará el archivo. Ver mi respuesta a continuación. – ProfK

Cuestiones relacionadas