Comprimir / Descomprimir Las Carpetas Y Archivos
-
08-06-2019 - |
Pregunta
¿Alguien sabe de una buena manera para comprimir o descomprimir archivos y carpetas en C# rápidamente?Manejo de archivos de gran tamaño puede ser necesario.
No hay solución correcta
Otros consejos
El .Net 2.0 framework de espacio de nombres System.IO.Compression
soporta algoritmos GZip y Deflate.Aquí hay dos métodos que se utilizan para comprimir y descomprimir un flujo de bytes que puede obtener de su objeto de archivo.Usted puede sustitución GZipStream
para DefaultStream
en los métodos que se indican a continuación para utilizar el algoritmo.Esto deja el problema de manejo de archivos comprimidos con los diferentes algoritmos de aunque.
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();
}
Yo siempre he usado el SharpZip de la Biblioteca.
Como de .Net 1.1 el único método disponible es llegar en las bibliotecas de java.
El uso de la Postal de Clases en la J# Bibliotecas de clases para Comprimir Archivos y Datos con C#
No estoy seguro si esto ha cambiado en las últimas versiones.
Usted puede utilizar un 3ra parte de la biblioteca, tales como SharpZip como Tom señaló.
De otra manera (sin ir 3ª parte) es usar el Shell de Windows API.Usted necesitará establecer una referencia a la Shell de Microsoft Controles y Automatización de la biblioteca COM en el proyecto de C#.Gerald Gibson tiene un ejemplo en:
Mi respuesta sería cerrar los ojos y optar por DotNetZip.Se ha probado por una gran comunidad.
GZipStream es una muy buena herramienta a utilizar.
Esto es muy fácil de hacer en java, y como se indicó anteriormente se puede llegar a la java.util.zip las bibliotecas de C#.Para las referencias:
java.util.zip javadocs
código de ejemplo
He utilizado este hace un tiempo para hacer una profunda (recursivo) zip de una estructura de carpetas, pero no creo que he utilizado la descompresión.Si estoy tan motivada que me puede sacar ese código y modificarlo en aquí más tarde.
Otra buena alternativa es también DotNetZip.
puede crear archivos 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, a continuación, puede descomprimir el archivo zip con este método:
1 - este método de trabajo con cremallera ruta de acceso del archivo
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 de trabajo con el archivo zip de flujo
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));
}