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).