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.
A partir de .Net 1.1, el único método disponible es llegar a las bibliotecas de Java.
Uso de las clases Zip en las bibliotecas de clases J # para comprimir archivos y datos con C #
No estoy seguro si esto ha cambiado en versiones recientes.
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.
Otra buena alternativa es también DotNetZip .
Puede usar una biblioteca de terceros como SharpZip, como señaló Tom.
Otra forma (sin ir a terceros) es usar la API de Windows Shell. Deberá establecer una referencia a la biblioteca COM de Microsoft Shell Controls and Automation en su proyecto C #. Gerald Gibson tiene un ejemplo en:
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));
}
Siempre he usado la biblioteca SharpZip.
GZipStream es una muy buena utilidad para usar.