[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: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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *