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).
Hola Javier,
Uff yo tuve muchos problemas con algo parecido hace un tiempo.
La cosa es que GZipStream comprime genial y descomprime tambien bien, pero solo descomprime lo que hayas comprimido con GZipStream (o por decirlo de otra manera con una version de zip de aquellas que usabamos en MS-DOS) :-S
Un archivo zip normal comprimido con tu WinZip, puede tener problemillas con esta clase de .NET
Para resolver el tema, tuve que recurir al espacio de nombres java.util.zip de nuestro querido J# de .NET
http://msdn.microsoft.com/en-us/magazine/cc164129.aspx
Un saludo 😉
Hola Javier, gracias por la opinion!
Si, por eso al final del post dejaba abierta la puerta a otro post, en mi caso utilizo una libreria de «Ionic» que si no recuerdo mal estaba basada en la que comentas.
Un saludo!
Introducción En el post anterior vimos como llevar a cabo la compresión y descompresión de un único fichero