[How To] Comprimir y Descomprimir ficheros

Introducción

Hoy me he percatado de la posibilidad de comprimir “un fichero” a través de .NET sin utilizar librerías de terceros”.

Dentro del Namespace IO (que se encuentra dentro de System), podemos encontrar el namespace “Compression”, donde encontraremos dos clases que nos van a permitir llevar a cabo esta tarea:

  • GZipStream: Clase que va a permitir llevar a cabo la compresión o descompresión de un fichero.
  • DeflateStream: Clase que va a permitir llevar a cabo la compresión o descompresión de un fichero a través del algoritmo “Deflate”.

Este Namespace es válido desde la versión 2 de .Net Framework, pero el ejemplo que voy a utilizar sería necesario adaptarlo puesto que hago uso del método CopyTo que está disponible desde la versión 4.

Ejemplo de Uso

Para el correcto funcionamiento de los ejemplos es necesario incluir los “using” a System.IO y System.IO.Compression.

 

¿Cómo comprimir un fichero?

   1: public void ComprimirFichero(string RutaFichero)

   2:       {

   3:           using (FileStream ficheroSalida = File.Create(String.Format("{0}.zip",RutaFichero)))

   4:           {

   5:               using (GZipStream zip = new GZipStream(ficheroSalida, CompressionMode.Compress))

   6:               {

   7:                   using (FileStream ficheroEntrada = File.OpenRead(RutaFichero))

   8:                   {

   9:                       ficheroEntrada.CopyTo(zip);

  10:                   }

  11:               }

  12:           }

  13:       }

¿Cómo descomprimir un fichero comprimido?

   1: public void DescomprimirFichero(string ficheroComprimido,string rutaDestino)

   2:        {

   3:            using (FileStream ficheroSalida = File.Create( rutaDestino))

   4:            {

   5:                    using (FileStream ficheroEntrada = File.OpenRead(ficheroComprimido))

   6:                    {

   7:                        using (GZipStream zip = new GZipStream(ficheroEntrada, CompressionMode.Decompress))

   8:                        {

   9:                            zip.CopyTo(ficheroSalida);

  10:                        }

  11:                }

  12:            }

  13:        }

 

Conclusión

Es una opción muy a tener en cuenta si lo que se necesita es comprimir un único fichero, en el caso de necesitar compresión de más ficheros o de carpetas tendremos que evaluar opciones de terceros (en breve publicaré algo).

 

Métodos ThenBy y ThenByDescending

Introducción

En este pequeño post vamos a ver como realizar una segunda ordenación de una colección de una forma distinta a través de los métodos extensores ThenBy y ThenByDescending.

 

Definición

Estos métodos extensores van a permitir realizar la ordenación según el campo que indiquemos siempre y cuando la colección ya se encuentre ordenada.

A diferencia de utilizar dos o más ordenaciones a través de los métodos OrderBy, ThenBy va a ordenar los elementos por la segunda categoría indicada en la condición de ordenación y no va eliminar el primer orden definido como si haría el uso del método OrderBy.

Ejemplo

Partiendo de una clase de ejemplo:

   1: public class Coche

   2:    {

   3:        public Coche()  {  }

   4:        public string Marca { get; set; }

   5:        public string Modelo { get; set; }

   6:    }

Y una colección con algunos datos de ejemplo:

   1: List<Coche> coches = new List<Coche>();

   2: coches.Add(new Coche { Marca = "Seat", Modelo = "Ibiza" });

   3: coches.Add(new Coche { Marca = "Seat", Modelo = "Cordoba" });

   4: coches.Add(new Coche { Marca = "Seat", Modelo = "Leon" });

   5: coches.Add(new Coche { Marca = "Seat", Modelo = "Toledo" });

   6:  

   7: coches.Add(new Coche { Marca = "Ford", Modelo = "Focus" });

   8: coches.Add(new Coche { Marca = "Ford", Modelo = "C-Max" });

   9: coches.Add(new Coche { Marca = "Ford", Modelo = "S-Max" });

  10: coches.Add(new Coche { Marca = "Ford", Modelo = "Fiesta" });

Ejemplos:

ThenBy:

   1: coches.OrderBy(a => a.Marca).

   2:     ThenBy(a => a.Modelo).

   3:     ToList().

   4:     ForEach(

   5:         coche => MessageBox.Show(String.Format("{0} - {1}", coche.Marca, coche.Modelo)));

ThenByDescending:

   1: coches.OrderBy(a => a.Marca).

   2:     ThenByDescending(a => a.Modelo).

   3:     ToList().

   4:     ForEach(

   5:         coche => MessageBox.Show(String.Format("{0} - {1}", coche.Marca, coche.Modelo)));

Si ambas ordenaciones son del mismo tipo (ascendente o descendente) a través de una query de LINQ podríamos lograr el mismo resultado:

   1: var query = from Coche c in coches

   2:             orderby c.Marca,c.Modelo

   3:             select c;

Conclusiones

Estos dos métodos extensores son una forma cómoda de llevar a cabo una segunda ordenación sobre un conjunto de elementos sin perder la primera ordenación definida.

 

Un saludo y espero que os sea de utilidad.