¿Alguien sabe de una buena manera de comprimir o descomprimir archivos y carpetas en C# rápidamente? Puede ser necesario manejar archivos grandes.Compresión/descompresión de carpetas y archivos
Respuesta
A partir de .Net 1.1, el único método disponible es llegar a las bibliotecas de Java.
Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C#
No estoy seguro de si esto ha cambiado en las versiones recientes.
Siempre he usado la biblioteca SharpZip.
Puede utilizar un 3rd-party library such as SharpZip como Tom señaló.
Otra forma (sin recurrir a terceros) es utilizar Windows Shell API. Tendrá que establecer una referencia a la biblioteca COM de automatización y controles de Shell de Microsoft en su proyecto C#. Gerald Gibson tiene un ejemplo en:
http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx
Esto es muy fácil de hacer en Java, y como se mencionó anteriormente se puede llegar a las bibliotecas java.util.zip de C#. Para referencias ver:
java.util.zip javadocs
sample code
he usado esto hace un tiempo para hacer una cremallera profunda (recursivo) de una estructura de carpetas, pero no creo que he usado la descompresión. Si estoy tan motivado, puedo sacar ese código y editarlo aquí más tarde.
El espacio de nombres de estructura .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 DefaultStream
en los métodos a continuación para usar ese algoritmo. Sin embargo, esto 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();
}
Otra buena alternativa es también DotNetZip.
GZipStream es una muy buena utilidad para usar.
Mi respuesta sería cerrar los ojos y optar por DotNetZip. Ha sido probado por una gran comunidad.
puede crear 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 se puede descomprimir el archivo zip con estos métodos: el trabajo
1- este método 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 la secuencia de archivo 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));
}
- 1. Eliminar carpetas y contener archivos
- 2. Python - Mover y sobrescribir archivos y carpetas
- 3. Eliminación de archivos y carpetas bloqueados
- 4. Crear archivos y carpetas de forma recursiva
- 5. Seguimiento de archivos/carpetas
- 6. ¿Cómo crear carpetas usando nombres de archivos y luego mover archivos a carpetas?
- 7. Comprimir archivos y carpetas en android
- 8. Distinga entre carpetas y archivos en C++
- 9. Mover archivos entre carpetas
- 10. Xcode archivos y carpetas limpian estructura y organización
- 11. Comprimir y descomprimir las carpetas y archivos usando Java
- 12. Organización de carpetas y archivos para el desarrollo de Python
- 13. Git Mover archivos a carpetas
- 14. Enumeración de carpetas y archivos usando Google Drive SDK V2
- 15. Trabajando con múltiples archivos de código y carpetas en Python
- 16. ¿Cómo agrego archivos y carpetas a los repositorios de GitHub?
- 17. ¿Cómo reemplazar cadena en archivos y nombres de archivos y carpetas recursivamente con PowerShell?
- 18. Comprobación de acceso a archivos/carpetas permiso
- 19. try_files Nginx (carpetas + archivos) de repliegue
- 20. Copie todos los archivos y carpetas usando msbuild
- 21. C# - ¿Cómo personalizar OpenFileDialog para seleccionar varias carpetas y archivos?
- 22. Diálogo requerido para seleccionar varios archivos y carpetas .NET
- 23. API para alternar "Mostrar archivos, carpetas y unidades ocultas"
- 24. Encontrar archivos y carpetas en un paquete OSGI
- 25. GTK + Filechooser para abrir ambos archivos y carpetas
- 26. Cómo incluir archivos y carpetas con 7zip powershell
- 27. WP7 Acceso a archivos y carpetas del teléfono
- 28. GENERIC_ALL y carpetas/archivos ACL? ¿Qué hace GENERIC_ALL realmente?
- 29. Copie carpetas sin archivos, archivos sin carpetas o todo usando PowerShell
- 30. Mantener los permisos de archivos y carpetas dentro de los archivos
Nota: Encontré un * int sobre flujo * error en el código de SharpZip hace años, que hizo que fallara en los archivos aleatorios que acababan de tener la combinación correcta de valores. No estoy seguro de si alguna vez se solucionó, pero desde la memoria cambié una variable 'int' por' long' en la fuente SharpZip para evitar el desbordamiento. * Tendré que intentar encontrar mi antiguo código fijo de SharpZip y verificar si coincide con el último *. –