Home :: Windows :: Artículos :: Comprimir y Descomprimir archivos con .Net Framework
 
comprimir_descomprimir_net

Comprimir y Descomprimir archivos con .Net Framework

mar 06, 2010 en Artículos,Productividad por

Sabes que puedes comprimir y descomprimir tus archivos usando las clases del .Net Framework? Pues si se puede! si quieres saber como se hace, te dejo este post para que te enteres.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Cuando uno programa en cualquier lenguaje, no sólo es bueno por la forma en que lo hace, sino porque aprovecha al máximo el entorno de trabajo y es capaz de hacer aplicaciones sumamente útiles.

Si tu eres un programador, nuevo o no, en la plataforma .Net lo que debes de hacer es aprender que herramientas u opciones te brinda el .Net Framework al momento de realizar la labor que te ha sido encomendada o que por simple curiosidad estas desarrollando.

Yo me encontré, dentro del namespace System.IO.Compression, una clase que me ha resultado sumamente útil para crear una aplicación, propia, que permita comprimir y descomprimir archivos de hasta 4GB de tamaño , esta clase se llama GZipStream. Cabe resaltar que esta Clase genera archivos comprimidos con extensión .gz.

Lo que voy a hacer es crear un proyecto en C#, del tipo Class Library, si no sabes crear un proyecto de este tipo, recomiendo leer este post para que te orientes antes de empezar. Por qué un proyecto del Tipo Class Library?, fácil , compilando este proyecto, puedas utilizarlo en una aplicación Windows, Consola o Web.

El proyecto Class Library, tiene por defecto una clase llamada Class 1, yo le llamare: CopstoneGZipClass.

Luego de crear el proyecto, voy a realizar los siguientes pasos:

Insertar los namespace respectivos

Como vamos a trabajar con archivos, básicamente, vamos a hacer referencia a dos namespace System.IO y System.IO.Compression.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*Agregar estos namespace para poder
trabajar adecuadamente con la clase GZipStream
y con archivos en General*/
using System.IO;
using System.IO.Compression;

Crear Métodos

Definido los namespace a utilizar, lo que vamos a hacer es crear dos métodos en la clase, uno que descomprima y otro que comprima el contenido de una carpeta, los métodos se llamaran Comprimir_Archivos_Carpeta y Descomprimir_Contenido_de_Carpeta

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Agregar estos namespace para poder
//trabajar adecuadamente con la clase GZipStream
using System.IO;
using System.IO.Compression;

namespace ClassLibraryCopstoneGZipClass
{
    public class CopstoneGZipClass
    {
         /* Path-> Carpeta donde se encuentra el archivo a descomprimir
            extension-> Extension del archivo que esta comprimido
          */
        public void Descomprimir_Contenido_de_Carpeta(string path,
                                      string extension)
        {
        }

        public void Comprimir_Archivos_Carpeta(string path)
        {
        }
    }
}

Codifiquemos ahora ambos métodos

Comprimir_Archivos_Carpeta

Este método lo que hace es, recorre una carpeta, cuya ubicación es enviada como parámetro, y comprime todos los archivos contenidos, colocando a estos la extensión .gz.

Te dejo el código para que lo analices:

 

public void Comprimir_Archivos_Carpeta(string path)
        {
            /*Creamos un objeto DirectoryInfo,
            que apunte a la ubicación de la carpeta a descomprimir*/
            DirectoryInfo dr = new DirectoryInfo(path);
            /*Necesitamos leer el archivo original (fsOrigen)
              para leer su contenido y descomprimirlo en fsDestino
            */
            FileStream fsOrigen = null;
            FileStream fsDestino = null;
            /*Instancia de la clase GZipStream,
             encargada de comprimir el contenido*/
            GZipStream gzip = null;
            /*Nombre de cada uno de los archivos de la carpeta*/
            string filename="";
            /*Definimos el tamaño del buffer*/
            const int bufferSize = 4096;
            /*Creamos un buffer*/
            byte[] buffer = new byte[bufferSize];
            /*Recorremos cada uno de los archivos del DirectoryInfo*/
            foreach (FileInfo fl in dr.GetFiles())
            {
                    /*Asignamos el nombre del archivo luego de comprimido*/
                    filename=fl.FullName+".gz";
                    /*Creamos una referencia para leer el archivo Original*/
                    fsOrigen = new FileStream(fl.FullName, FileMode.Open,
                                         FileAccess.Read, FileShare.Read);
                    /*Creamos el archivo nuevo para colocar la información*/
                    fsDestino = new FileStream(filename, FileMode.Create,
                                         FileAccess.Write, FileShare.None);
                    /*Le indicamos al objeto gzip, que vamos
                      a comprimir un archivo*/
                    gzip = new GZipStream(fsOrigen, CompressionMode.Compress,
                                          true);
                    /*Mientras que el archivo original tenga informacion,
                     * lo leemos, con el objeto gzip y si este proceso
                     * retorna información, grabamos la misma en
                       el archivo de destino*/
                   while (true )
                    {
                      int  cantleida = gzip.Read(buffer, 0, bufferSize);
                      if (cantleida != 0)
                         gzip.Write(buffer, 0, cantleida);
                      else
                         break;

                    }

                }
            }

Descomprimir_Contenido_de_Carpeta

Este método lo que hace es, recorre una carpeta, cuya ubicación es enviada como parámetro, y descomprime todos los archivos contenidos, cuya extensión es .gz, le estoy agregando a esta función un parámetro adicional: la extensión del archivo luego de descomprimido.

Bueno, aquí te va el código:

 public void Descomprimir_Contenido_de_Carpeta(string path,string extension)
    {
       /*Creamos un objeto DirectoryInfo,
       que apunte a la ubicación de la carpeta a descomprimir*/
       DirectoryInfo dr = new DirectoryInfo(path);
       /*Necesitamos leer el archivo original (fsOrigen)
       para leer su contenido y descomprimirlo en fsDestino*/
       FileStream fsOrigen = null;
       FileStream fsDestino = null;
       /*Instancia de la clase GZipStream,
       encargada de descomprimir el contenido*/
       GZipStream gzip = null;
       /*Nombre de cada uno de los archivos de la carpeta*/
       string filename="";
       /*Definimos el tamaño del buffer*/
       const int bufferSize = 4096;
       /*Creamos un buffer*/
       byte[] buffer = new byte[bufferSize];
       /*Recorremos cada uno de los archivos del DirectoryInfo*/
       foreach (FileInfo fl in dr.GetFiles())
       {
         /*Nos aseguramos que el archivo a descomprimir tenga extension .gz*/
         if (fl.Extension.IndexOf("gz") != -1)
           {
              /*Asignamos el nombre del archivo luego de descomprimido*/
              filename=fl.FullName+"."+extension;
              /*Creamos una referencia para leer el archivo Original*/
              fsOrigen = new FileStream(fl.FullName, FileMode.Open,
                                     FileAccess.Read, FileShare.Read);
              /*Creamos el archivo nuevo para colocar la información*/
              fsDestino = new FileStream(filename, FileMode.Create,
                                     FileAccess.Write, FileShare.None);
              /*Le indicamos al objeto gzip, que vamos a
                descomprimir un archivo*/
              gzip = new GZipStream(fsOrigen, CompressionMode.Decompress, true);
              /*Mientras que el archivo original tenga informacion,
              * lo leemos, con el objeto gzip y si este proceso
              * retorna información, grabamos la misma en
              * el archivo de destino*/
              while (true)
              {
               int cantleida = gzip.Read(buffer, 0, bufferSize);
               if (cantleida != 0)
               fsDestino.Write(buffer, 0, cantleida);
               if (cantleida != bufferSize)  break;
		    }

           }
     }
  }

Espero que luego de construir este proyecto, puedas utilizarlo en tus aplicaciones.


Autor:


Comentarios (2)

Elías Rivera dice:

gracias por compatir tus conocimientos, es muy valioso.

Abel dice:

Muy buen aporte, mcuhas gracias mano.

Deja un comentario

   

copstone en Facebook

Otros artículos

.Net Framework nace sobre la base de la nueva generacion de software, en donde la tendencia es ofrecer y solictar servicios de forma que permita a distintas tecnologias interoperar entre sí. Ya no debemos pensar que nuestra aplicación es una isla en medio del océeano, sino buscar de interconectar diversos sistemas operativos, dispositivos y sobre todo fuentes de informacion. .Net Framework brinda a los desarrolladores las herramientas y tecnologías necesarias para desarrollar soluciones de negocios de manera rapida sin importar que involucren diversos medios y tecnologias, basándose en estándares de la industria de forma que llevar una adecuada interoperbilidad entre diversos medios.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Antes de comenzar a desarrollar aplicaciones web, es necesario que tengas un ambiente de prueba donde puedas experimentar antes de publicar tu contenido en la web. El primer paso para crear el ambiente es instalar un servidor web o http y eso es lo que te mostraré en este artículo.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Uno mas uno, según las matemáticas es dos, pero si a un puntero le sumamos uno, cuánto sale?. Si tienes la respuesta o si tienes una duda, te invito a leer este post.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

En este artículo enseño los conceptos básicos a todos los que quieran comenzar a desarrollar aplicaciones de entorno visual en C++ con Visual Studio.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Estás cansado de ver siempre la forma rectangular en tus aplicaciones? Quieres hacer que tu formulario tenga una forma circular o que se parezca a una caricatura? En este artículo te voy a enseñar a modificar la forma rectangular del formulario por la que tu quieras.

FacebookGoogle BookmarksGoogle GmailTwitterYahoo MailHotmailLinkedInShare

Calendario

marzo 2010
L M X J V S D
« feb   abr »
1234567
891011121314
15161718192021
22232425262728
293031  

Categorías

Comparte este artículo

  • Facebook
  • Google Bookmarks
  • Google Gmail
  • Twitter
  • Yahoo Mail
  • Hotmail
  • LinkedIn
  • Share
TIENES ALGO QUE PREGUNTAR? ESCRÍBENOS AQUÍ

Copyright © 2012 - Programando por diversion

Subir