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.
gracias por compatir tus conocimientos, es muy valioso.
Muy buen aporte, mcuhas gracias mano.