online net descomprimir descargar comprimir como carpeta archivos archivo c# .net file decompression compression

c# - net - Comprimir/descomprimir carpetas y archivos



ziparchive c# (9)

¿Alguien sabe de una buena manera de comprimir o descomprimir archivos y carpetas en C # rápidamente? Puede ser necesario manejar archivos grandes.



El espacio de nombres de marco .Net 2.0 System.IO.Compression admite los algoritmos GZip y Deflate. Aquí hay dos métodos que comprimen y descomprimen una secuencia de bytes que puede obtener de su objeto de archivo. Puede sustituir GZipStream por GZipStream en los métodos a continuación para usar ese algoritmo. Sin embargo, esto todavía deja el problema de manejar archivos comprimidos con diferentes algoritmos.

public static byte[] Compress(byte[] data) { MemoryStream output = new MemoryStream(); GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true); gzip.Write(data, 0, data.Length); gzip.Close(); return output.ToArray(); } public static byte[] Decompress(byte[] data) { MemoryStream input = new MemoryStream(); input.Write(data, 0, data.Length); input.Position = 0; GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true); MemoryStream output = new MemoryStream(); byte[] buff = new byte[64]; int read = -1; read = gzip.Read(buff, 0, buff.Length); while (read > 0) { output.Write(buff, 0, read); read = gzip.Read(buff, 0, buff.Length); } gzip.Close(); return output.ToArray(); }


Esto es muy fácil de hacer en Java, y como se indicó anteriormente, puede acceder a las bibliotecas java.util.zip desde C #. Para referencias ver:

java.util.zip javadocs
Código de muestra

Utilicé esto hace un tiempo para hacer un zip profundo (recursivo) de una estructura de carpetas, pero no creo que alguna vez haya usado la descompresión. Si estoy tan motivado, puedo extraer ese código y editarlo aquí más adelante.


Mi respuesta sería cerrar los ojos y optar por DotNetZip . Ha sido probado por una gran comunidad.




Puedes crear un archivo zip con este método:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name) { var path = HostingEnvironment.MapPath(TempPath) + name; await Task.Run(() => { if (File.Exists(path)) File.Delete(path); ZipFile.CreateFromDirectory(sourceDirectoryPath, path); }); return path; }

y luego puedes descomprimir el archivo zip con estos métodos:
1- este método funciona con la ruta del archivo zip

public async Task ExtractZipFile(string filePath, string destinationDirectoryName) { await Task.Run(() => { var archive = ZipFile.Open(filePath, ZipArchiveMode.Read); foreach (var entry in archive.Entries) { entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true); } archive.Dispose(); }); }

2- este método funciona con flujo de archivos zip

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName) { string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue); using (FileStream output = new FileStream(filePath, FileMode.Create)) { await zipFile.CopyToAsync(output); } await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName)); await Task.Run(() => File.Delete(filePath)); }