Introducción
En el post anterior vimos como llevar a cabo la compresión y descompresión de un único fichero a través de la clase GZipStream.
En este post vamos a ver como llevar a cabo la compresión y descompresión de varios ficheros a través de una libreria de terceros, en este caso, Ionic.
Pasos a realizar:
En primer lugar para poder utilizar esta librería es necesario que agreguemos la referencia a la DLL descargada “Ionic.Utils.Zip.dll”.
Una vez referenciada la DLL, vamos a crear los métodos necesarios para llevar a cabo los procesos que necesitamos.
Para el correcto funcionamiento de los métodos será necesario, incluir el using al namespace : “Ionic.Utils.Zip”
Ambos métodos los voy a definir dentro de una clase que voy a llamar ZipUtils.
Compresión de Ficheros
Para realizar la compresión de un conjunto de ficheros, primero vamos a necesitar un conjunto de ficheros a comprimir, y después vamos a necesitar una ruta de destino de dicho fichero.
Además de ello, vamos a necesitar el objeto que va a ser el encargado de realizar la compresión de los ficheros, en este caso va a ser un objeto de tipo ZipFile que se encuentra definido en la librería indicada anteriormente.
1: public static void ComprimirFicheros(List<string> Files, string Zip)
2: {
3: if (string.IsNullOrWhiteSpace(Zip)) throw new ArgumentNullException("ZipFile", "No se ha especificado la ruta del fichero de destino.");
4: if (Files == null) throw new ArgumentNullException("Files", "No se han especificado ficheros a comprimir.");
5: if (!Files.Any()) throw new ArgumentNullException("ZipFile", "No se han especificado ficheros a comprimir.");
6: using (ZipFile compressZip = new ZipFile(Zip))
7: {
8: Files.ForEach(a =>
9: {
10: if (System.IO.File.GetAttributes(a) == System.IO.FileAttributes.Directory)
11: {
12:
13: if (!System.IO.Directory.Exists(a)) throw new Exception(String.Format("El fichero {0} no se ha encontrado.", a));
14: if (System.IO.File.Exists(Zip))
15: compressZip.UpdateDirectory(a);
16: else
17: compressZip.AddDirectory(a);
18:
19: }
20: else
21: {
22: if (!System.IO.File.Exists(a)) throw new Exception(String.Format("El fichero {0} no se ha encontrado.", a));
23: if (System.IO.File.Exists(Zip))
24: compressZip.UpdateFile(a);
25: else
26: compressZip.AddFile(a);
27: }
28: }
29: );
30: compressZip.Save();
31: }
Para probar este código bastaría con ejecutar el siguiente fragmento de código:
1: string Fichero = @"c:testingCompresion.zip";
2: List<string> ficheros = new List<string>();
3: ficheros.Add(@"C:testdocumento.pdf");
4: ficheros.Add(@"C:Nueva Carpeta");
5: try
6: {
7: ZipUtils.ComprimirFicheros(ficheros, Fichero);
8: }
9: catch (Exception ex)
10: {
11:
12: MessageBox.Show(ex.Message);
13: }
Descompresión de Ficheros
Para realizar la descompresión de un fichero, primero vamos a necesitar la ruta del fichero a descomprimir, y la ruta donde se va a descomprimir.
1: public static void DescomprimirFicheros(string Zip,string RutaDestino)
2: {
3: if (string.IsNullOrWhiteSpace(Zip)) throw new ArgumentNullException("ZipFile", "No se ha especificado la ruta del fichero de origen.");
4: if (string.IsNullOrWhiteSpace(RutaDestino)) throw new ArgumentNullException("RutaDestino", "No se ha especificado la ruta de destino.");
5: if (!System.IO.File.Exists(Zip)) throw new Exception(String.Format("El fichero {0} no se ha encontrado.", Zip));
6: if (!System.IO.Directory.Exists(RutaDestino)) throw new Exception(String.Format("La ruta de destino {0} ya existe.", RutaDestino));
7:
8: using (ZipFile FicheroComprimido = ZipFile.Read(Zip))
9: {
10: FicheroComprimido.ExtractAll(RutaDestino);
11: }
12: }
Para probar este código bastaría con ejecutar el siguiente fragmento de código:
1: string Fichero = @"c:testingCompresion.zip";
2: try
3: {
4: ZipUtils.DescomprimirFicheros(Fichero, @"c:rutaDestino");
5: }
6: catch (Exception ex)
7: {
8:
9: MessageBox.Show(ex.Message);
10: }
Conclusiones
Personalmente pienso que esta librería, nos da mucho juego a la hora de la compresión de distintos ficheros, y pose un buen abanico de posibilidades con las que jugar.
Os invito a que visitéis el conjunto de ejemplos disponibles en Codeplex.
Un saludo, y espero que os sea de utilidad.