Carpeta zip en C #

¿Qué es un ejemplo (código simple) de cómo comprimir una carpeta en C #?


Actualizar:

No veo el espacio de nombres ICSharpCode . Descargué ICSharpCode.SharpZipLib.dll pero no sé dónde copiar ese archivo DLL. ¿Qué debo hacer para ver este espacio de nombres?

Y tiene un enlace para ese ejemplo de MSDN para la carpeta de compresión, porque leí todo MSDN pero no pude encontrar nada.


OK, pero necesito la siguiente información.

¿Dónde debería copiar ICSharpCode.SharpZipLib.dll para ver ese espacio de nombres en Visual Studio?

Esta respuesta cambia con .NET 4.5. Crear un archivo zip se vuelve increíblemente fácil . No se requerirán bibliotecas de terceros.

 string startPath = @"c:\example\start"; string zipPath = @"c:\example\result.zip"; string extractPath = @"c:\example\extract"; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath); 

Desde el archivo de ayuda de DotNetZip , http://dotnetzip.codeplex.com/releases/

 using (ZipFile zip = new ZipFile()) { zip.UseUnicodeAsNecessary= true; // utf-8 zip.AddDirectory(@"MyDocuments\ProjectX"); zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ; zip.Save(pathToSaveZipFile); } 

No hay nada en el BCL que haga esto por usted, pero hay dos excelentes bibliotecas para .NET que admiten la funcionalidad.

  • SharpZipLib
  • DotNetZip

He usado ambos y puedo decir que los dos son muy completos y tienen API bien diseñadas, por lo que es principalmente una cuestión de preferencia personal.

No estoy seguro de si admiten explícitamente agregar carpetas en lugar de solo archivos individuales para comprimir archivos, pero debería ser bastante fácil crear algo iterativo recursivamente sobre un directorio y sus subdirectorios utilizando las clases DirectoryInfo y FileInfo .

En .NET 4.5, ZipFile.CreateFromDirectory (startPath, zipPath); método no cubre un escenario en el que desea comprimir varios archivos y subcarpetas sin tener que colocarlos dentro de una carpeta. Esto es válido cuando desea descomprimir para poner los archivos directamente en la carpeta actual.

Este código funcionó para mí:

 public static class FileExtensions { public static IEnumerable AllFilesAndFolders(this DirectoryInfo dir) { foreach (var f in dir.GetFiles()) yield return f; foreach (var d in dir.GetDirectories()) { yield return d; foreach (var o in AllFilesAndFolders(d)) yield return o; } } } void Test() { DirectoryInfo from = new DirectoryInfo(@"C:\Test"); using (FileStream zipToOpen = new FileStream(@"Test.zip", FileMode.Create)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)) { foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast()) { var relPath = file.FullName.Substring(from.FullName.Length+1); ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath); } } } } 

Las carpetas no necesitan ser “creadas” en el archivo zip. El segundo parámetro “entryName” en CreateEntryFromFile debe ser una ruta relativa, y al desempaquetar el archivo zip, los directorios de las rutas relativas serán detectados y creados.

Hay una clase ZipPackage en el espacio de nombres System.IO.Packaging que está integrado en .NET 3, 3.5 y 4.0.

http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

Aquí hay un ejemplo de cómo usarlo. http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print

Hay un artículo en MSDN que tiene una aplicación de muestra para comprimir y descomprimir archivos y carpetas puramente en C #. He estado usando algunas de las clases exitosamente durante mucho tiempo. El código se libera bajo la Licencia Permissive de Microsoft, si necesita saber ese tipo de cosas.

EDITAR: Gracias a Cheeso por señalar que estoy un poco rezagado. El ejemplo de MSDN al que me refería es, de hecho, el uso de DotNetZip y en realidad está muy completo en estos días. De acuerdo con mi experiencia de una versión anterior de esto, lo recomendaría felizmente.

SharpZipLib también es una biblioteca bastante madura y está altamente calificada por personas, y está disponible bajo la licencia GPL. Realmente depende de tus necesidades de compresión y de cómo ver los términos de la licencia para cada uno de ellos.

Rico

El código siguiente utiliza un componente ZIP de terceros de Rebex :

 // add content of the local directory C:\Data\ // to the root directory in the ZIP archive // (ZIP archive C:\archive.zip doesn't have to exist) Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.zip", @"C:\Data\*", ""); 

O si desea agregar más carpetas sin necesidad de abrir y cerrar el archivo varias veces:

 using Rebex.IO.Compression; ... // open the ZIP archive from an existing file ZipArchive zip = new ZipArchive(@"C:\archive.zip", ArchiveOpenMode.OpenOrCreate); // add first folder zip.Add(@"c:\first\folder\*","\first\folder"); // add second folder zip.Add(@"c:\second\folder\*","\second\folder"); // close the archive zip.Close(ArchiveSaveAction.Auto); 

Puede descargar el componente ZIP aquí .

Usar una SharpZipLib libre y con licencia LGPL es una alternativa común.

Descargo de responsabilidad: trabajo para Rebex

"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"

Necesita agregar el archivo dll como referencia en su proyecto. Haga clic derecho en Referencias en el Explorador de soluciones-> Agregar referencia-> Buscar y luego seleccione el dll.

Finalmente, deberá agregarlo como una statement de uso en los archivos en los que quiera usarla.

ComponentPro ZIP puede ayudarte a lograr esa tarea. El siguiente fragmento de código comprime archivos y directorios en una carpeta. También puedes usar la máscara wilcard.

 using ComponentPro.Compression; using ComponentPro.IO; ... // Create a new instance. Zip zip = new Zip(); // Create a new zip file. zip.Create("test.zip"); zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive. // Add all files and subdirectories from 'c:\test' to the archive. zip.AddFiles(@"c:\test"); // Add all files and subdirectories from 'c:\my folder' to the archive. zip.AddFiles(@"c:\my folder", ""); // Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2", "22"); // Add all .dat files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2", "22", "*.dat"); // Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2\*.dat", "22"); // Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive. zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22"); TransferOptions opt = new TransferOptions(); // Donot add empty directories. opt.CreateEmptyDirectories = false; zip.AddFiles(@"c:\abc", "/", opt); // Close the zip file. zip.Close(); 

http://www.componentpro.com/doc/zip tiene más ejemplos

usando DotNetZip (disponible como paquete nuget):

 public void Zip(string source, string destination) { using (ZipFile zip = new ZipFile { CompressionLevel = CompressionLevel.BestCompression }) { var files = Directory.GetFiles(source, "*", SearchOption.AllDirectories). Where(f => Path.GetExtension(f). ToLowerInvariant() != ".zip").ToArray(); foreach (var f in files) { zip.AddFile(f, GetCleanFolderName(source, f)); } var destinationFilename = destination; if (Directory.Exists(destination) && !destination.EndsWith(".zip")) { destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.zip"; } zip.Save(destinationFilename); } } private string GetCleanFolderName(string source, string filepath) { if (string.IsNullOrWhiteSpace(filepath)) { return string.Empty; } var result = filepath.Substring(source.Length); if (result.StartsWith("\\")) { result = result.Substring(1); } result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length); return result; } 

Uso:

 Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest"); 

O

 Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.zip"); 
    Intereting Posts