Trabalhando com Gzipstream e Deflatestream no C#.NET Sumario0 - Introducao1 - O que e GZip?2 - O que e Deflate?3 - Exemplo Gzipstream e Deflatestream4 - Conclusao5 - Referencias 0 - Introducao Por meio pequeno artigo ou tutorial vou tentar ensinar como fazer para comprimir e descomprimir arquivos utilizando dois algoritmos que a linguagem C#.NET disponiliza para o desenvolvedor. Para desenvolver foi usado o Visual Studio 2008 C#.NET Express (disponilizado gratuitamente no site da Microsoft).Primeiro vamos enteder o que e o Gzipstream e Deflatestream. Depois vamos botar a mao na massa e desenvolver um pequeno e simples exemplo para cada.1 - O que e Gzip?Gzip e um formato inclui um verificacao de redundancia ciclica valor para detectar corrupcao de dados.Atualmente usa o metodo de compressao deflate mas pode ser facilmente estendido para usar outros metodos de compressao. O formato pode ser implementado rapidamente em uma forma nao cobertos por patentes.[1]2 - O que e Deflate?Deflate definie um formato de compressao sem perda de dados, usando uma combinacao do algoritmo LZ77 e codificacao de Huffman, com eficiencia comparavel aos melhores metodos disponiveis atualmente de compressao de proposito geral.[2]A funcionalidade de compactacao em DeflateStream e GZipStream sao expostas como um stream. Os dados sao lidos em uma base byte-by-byte, por isso nao e possivel realizar varias passagens para determinar o melhor metodo para compressao de arquivos inteiros ou grandes blocos de dados. As classes DeflateStream[3] e GZipStream[4] sao mais utilizados em fontes de dados sem compressao. Se os dados de origem ja estiver compactada, usando essas classes podem realmente aumentar o tamanho do fluxo.3 - Exemplo Gzipstream e DeflatestreamAgora vamos para parte pratica. Sera mostrado um algoritmo explicando como comprimir e descomprimir em Gzipstream e depois o Deflatestream. Cada um tera um metodo, totalizando quatro:comprimirGzip;descomprimirGzip;comprimirDeflate;descomprimirDeflate;Se voce e iniciante na linguagem e ainda esta aprendendo sobre a sua sintaxe e bom voce dar uma lida nessa observacao:using - Voce pode entende-lo como a liberacao de recursos, logo que ele e chamando o dispose automaticamente. Para saber mais sobre o que e dispose clique aqui.Todos os metodos recebem como parametro um arquivo FileInfo. Ex: public voidcomprimirGzip(FileInfo fiArq){ //TODO O METODO AQUI!}ou public void comprimirGzip(FileInfo fi){ //TODO O METODO AQUI!}//* comprimirGzip *// Cria uma stream,// nela fica contido o conteudo no arquivo.using (FileStream inFile = fiArq.OpenRead()){ // Pega o Nome inteiro do arquivo // Verifica se o nome do arquivo eh diferente de .gz // EX: arquivo.exe.gz fica arquivo.exe if ((File.GetAttributes(fiArq.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fiArq.Extension != ".gz") { // Cria um arquivo .gz // Recebera o conteudo do arquivo original // para depois ser comprimido. using (FileStream outFile = File.Create(fiArq.FullName + ".gz")) { // Compress cria o arquivo comprimido. using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress)) { // Copia o conteudo de Compress inFile.CopyTo(Compress); } } } }/* descomprimirGzip */// Cria uma FileStream, // nela fica contido o conteudo no arquivo. using (FileStream inFile = fi.OpenRead()) { // Remove a extencao para pegar // somente o nome do arquivo string curFile = fi.FullName; string origName = curFile.Remove(curFile.Length - fi.Extension.Length); // Cria um FileStream semelhante ao