jueves, 23 de julio de 2015

Receta C# No. 5-23: Comprimir y Descomprimir un Archivo

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Clase GZipStream
3.2 Clase DeflateStream
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Otras de las operaciones comunes en la manipulación de archivos y directorios consiste en comprimir y descomprimir datos. La gran utilidad de este proceso es reducir el tamaño de los archivos para facilitar su portabilidad; y esto lo podemos llevar a cabo en el lenguaje de programación administrado C#. Entonces esta receta nos lleva al estudio de dos clases imprescindibles para realizar esta tarea GZipStream, y DeflateStream.

1. Problema

Se requiere escribir y leer datos hacia y desde un archivo comprimido.

2. Solución

En el namespace System.IO.Compression encontramos dos clases que nos permite alcanzar este:
  • GZipStream, y 
  • DelfateStream.

3. Discusión de la Solución

3.1 Clase GZipStream

La clase GZipStream [2] (System.IO.Compression) está diseñada para la compresión y descompresión de datos. En su defecto, usa gzip [3] como formato de archivo para la compresión y descompresión; para ello utiliza el algoritmo DEFLATE [4]. Este algoritmo incluye características como:
  • estándar industrial, 
  • compresión y descompresión sin pérdida, y 
  • comprobación de redundancia cíclica.
Por otra parte, los objetos comprimidos con la clase GZipStream generan archivos con la extensión .gz y permiten ser manipulados desde herramientas de compresión (e.g., 7-Zip [5], WinRAR [8]).

La lectura y escritura de flujos de esta clase se realiza se lleva a cabo en arreglos de bytes [1]. Además, [2]:
~"...GZipStream class is best used on uncompressed sources of data. If the source data is already compressed, using this class may actually increase the size of the stream."
Ejemplo de uso:

Archivo C# UsoGZipStream.cs [Enlace alternativo][Enlace alternativo]: 

En las líneas 16-21 validamos el número de argumentos introducidos por el usuario desde la línea de comandos. En el bloque try (líneas 23-41) ocurren las siguientes operaciones:
  • Líneas 29-34: Validación de la existencia del archivo especificado por el usuario.
  • Línea 36: Apertura del archivo como un objeto FileStream.
  • Línea 38: Muestra el nombre y tamaño del archivo sin comprimir.
  • Línea 39: Invocación del método ComprimirArchivo:
    • Línea 52: Creación de arreglo de bytes.
    • Línea 53: Lectura de los bytes a comprimir.
    • Línea 56: Creación de objeto FileStream con el archivo a comprimir. Uso de extensión de archivo .gz.
    • Línea 58: Instanciación de objeto GZipStream.
    • Línea 60: Escritura de los bytes comprimidos.
    • Línea 65: Apertura del archivo recién comprimido con el propósito de conocer su nombre y su tamaño en bytes.
Compilación: 

  1. csc /target:exe UsoGZipStream.cs

Ejecución assembly

  1. .\UsoGZipStream.exe

> Prueba de ejecución: 
Ejecución assembly UsoGZipStream.exe
Figura 1. Ejecución assembly UsoGZipStream.exe.
Notemos la diferencia en tamaño de los dos archivos.

3.2 Clase DeflateStream

Con la clase DeflateStream [6] (System.IO.Compression) podemos comprimir y descomprimir datos. Internamente, esta clase usa el algoritmo DEFLATE, el cual consistituye un estándar industrial para la compresión y descompresión de datos sin pérdida.

Desde la versión 4.5 de Microsoft .NET Framework, esta clase usa la librería zlib [7]; y como manifiestan en [6]
"...it provides a better compression algorithm and, in most cases, a smaller compressed file than it provides in earlier versions of the .NET Framework."
También vale añadir [6]:
"...Data is read on a byte-by-byte basis, so it is not possible to perfom multiple passes to determine the best method for compressing entire files or large blocks of data."

4. Práctica: Código C#

Afiancemos nuestro conocimiento sobre el proceso de compresión y descompresión de archivos en C# con la siguiente aplicación de consola:

Instanciamos un objeto GZipStream para la creación de un archivo de compresión -archivo_comprimido.zip- (línea 16). Enseguida pasamos a crear un objeto StreamWriter como flujo de escritura sobre el archivo comprimido (línea 20).


Con (línea 23

sw.WriteLine("OrtizOL - Experiencias Construcción Software");


escribimos la cadena de caracteres "OrtizOL - Experiencias Construcción Software" en el archivo comprimido.

Ahora descomprimimos el archivo: 
  • Línea 29: Apertura del archivo archivo_comprimido.zip a modo de descompresión: CompressionMode.Decompress.
  • Línea 33: Instanciación de objeto StreamReader para la lectura de los datos descomprimidos.
  • Línea 36: Muestra el contenido de los datos comprimidos.
Compilación: 

  1. csc /target:exe CompresionArchivos.cs


Ejecución assembly


  1. .\CompresionArchivos.exe

> Prueba ejecución: 
Ejecución assembly CompresionArchivos.exe
Figura 2. Ejecución assembly CompresionArchivos.exe.

5. Conclusiones

Estudiamos cómo comprimir archivos y texto usando la clase GZipStream en el lenguaje de programación C#. Comprimir y descomprimir datos nos será de bastante utilidad cuando creemos archivos que requieren ser portables o transportables por medio de una red lenta, por ejemplo.


En la siguiente receta C# nos centraremos en el estudio de datos de registro (log) de un archivo.

6. Glosario

  • Algoritmo
  • Archivo
  • Comprimir
  • Descomprimir
  • Directorio
  • Flujo
  • INFLATE
  • Red

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: GZipStream Class (System.IO.Compression) - https://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream(v=vs.110).aspx
[3]: gzip - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Gzip
[4]: DEFLATE - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/DEFLATE
[5]: 7-Zip - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/7-Zip
[6]: DeflateStream Class (System.IO.Compression) - https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream(v=vs.110).aspx
[7]: zlib - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Zlib
[8]: WinRAR - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/WinRAR


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.