Índice
0. Introducción1. 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]:
Ejemplo de uso:~"...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."
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:
- csc /target:exe UsoGZipStream.cs
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:
- csc /target:exe CompresionArchivos.cs
Ejecución assembly:
- .\CompresionArchivos.exe
> Prueba ejecución:
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.