compression - una - SharpLibZip: agregar archivo sin ruta
obtener la ruta de un archivo en java (3)
¿Qué hay de 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();
}
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.
string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
zipFile.BeginUpdate();
foreach (string file in files)
{
zipFile.Add(file);
}
zipFile.CommitUpdate();
}
No puedo encontrar nada sobre una opción para esto en la documentación provista. Como esta es una biblioteca muy popular, espero que alguien que lea esto pueda saber algo.
La entrada de MSDN para Directory.GetFiles()
indica que los nombres de archivos devueltos se anexan al parámetro de ruta proporcionado. ( http://msdn.microsoft.com/en-us/library/07wt70x2.aspx ), por lo que las cadenas que está pasando a zipFile.Add()
contienen la ruta.
Según la documentación de 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.
Pruebe 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();
}
Mi solución fue establecer la propiedad del objeto NameTransform
de ZipFile
en 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 que la propiedad NameTransform es de tipo INameTransform
, lo que permite la personalización de las transformaciones de nombres.