[How To] Comprimir y Descomprimir Ficheros (II) - El blog de Javier Torrecilla

[How To] Comprimir y Descomprimir Ficheros (II)

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:\test\documento.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.

Published 19/10/2011 16:06 por Javier Torrecilla
Archivado en:
Comparte este post:
http://geeks.ms/blogs/jtorrecilla/archive/2011/10/19/how-to-comprimir-y-descomprimir-ficheros-ii.aspx