Trabalhando com Gzipstream e Deflatestream no C#.NET
Sumário
0 - Introdução
1 - O que é GZip?
2 - O que é Deflate?
3 - Exemplo Gzipstream e Deflatestream
4 - Conclusão
5 - Referências
0 - Introdução
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).
0 - Introdução
1 - O que é GZip?
2 - O que é Deflate?
3 - Exemplo Gzipstream e Deflatestream
4 - Conclusão
5 - Referências
0 - Introdução
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 é o Gzipstream e Deflatestream. Depois vamos botar a mão na massa e desenvolver um pequeno e simples exemplo para cada.
1 - O que é Gzip?
Gzip é um formato inclui um verificação de redundância cíclica valor para detectar corrupção de dados.Atualmente usa o método de compressão deflate mas pode ser facilmente estendido para usar outros métodos de compressão. O formato pode ser implementado rapidamente em uma forma não cobertos por patentes.[1]
2 - O que é Deflate?
Deflate definie um formato de compressão sem perda de dados, usando uma combinação do algoritmo LZ77 e codificação de Huffman, com eficiência comparável aos melhores métodos disponíveis atualmente de compressão de propósito geral.[2]
A funcionalidade de compactação em DeflateStream e GZipStream são expostas como um stream. Os dados são lidos em uma base byte-by-byte, por isso não é possível realizar várias passagens para determinar o melhor método para compressão de arquivos inteiros ou grandes blocos de dados. As classes DeflateStream[3] e GZipStream[4] são mais utilizados em fontes de dados sem compressão. Se os dados de origem já estiver compactada, usando essas classes podem realmente aumentar o tamanho do fluxo.
3 - Exemplo Gzipstream e Deflatestream
Agora vamos para parte prática. Sera mostrado um algoritmo explicando como comprimir e descomprimir em Gzipstream e depois o Deflatestream. Cada um terá um método, totalizando quatro:
- comprimirGzip;
- descomprimirGzip;
- comprimirDeflate;
- descomprimirDeflate;
Se você é iniciante na linguagem e ainda está aprendendo sobre a sua sintaxe é bom você dar uma lida nessa observação:
using - Você pode entende-lo como a liberação de recursos, logo que ele é chamando o dispose automaticamente. Para saber mais sobre o que é dispose clique aqui.
Todos os métodos recebem como parâmetro um arquivo FileInfo. Ex:
public voidcomprimirGzip(FileInfo fiArq) { //TODO O MÉTODO AQUI! }ou
public void comprimirGzip(FileInfo fi) { //TODO O MÉTODO 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 metodo de comprimir using (FileStream outFile = File.Create(origName)) { using (GZipStream Decompress = new GZipStream(inFile, CompressionMode.Decompress)) { Decompress.CopyTo(outFile); } } }
Os outros dois métodos para Deflate não fogem dessa estrutura. Não há segredo!
/* comprimirDeflate */ using (FileStream inFile = fi.OpenRead()) { if ((File.GetAttributes(fi.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fi.Extension != ".cmp") { using (FileStream outFile = File.Create(fi.FullName + ".cmp")) { // A unica coisa que muda é o metodo de compressao! using (DeflateStream Compress = new DeflateStream(outFile, CompressionMode.Compress)) { inFile.CopyTo(Compress); } } } } /* descomprimirDeflate */ using (FileStream inFile = fi.OpenRead()) { string curFile = fi.FullName; string origName = curFile.Remove(curFile.Length - fi.Extension.Length); using (FileStream outFile = File.Create(origName)) { using (DeflateStream Decompress = new DeflateStream(inFile, CompressionMode.Decompress)) { Decompress.CopyTo(outFile); } } }
4 - Conclusão
Foi possível observar neste pequeno tutorial uma forma simples e básica de compressão que você pode usar no dia-a-dia para tarefas simples. O nível de dificuldade para implementar essa solução é básica, foi usada pouca lógica e bastante a classes e métodos que a GZipstream, Deflatestream e a linguagem e plataforma C#.NET fornecem ao desenvolvedor.
5 - Referências
[1] - RFC: 1952 - GZIP file format specification version 4.3. Disponível em: http://www.ietf.org/rfc/rfc1952.txt
[2] - RFC: 1951 - Deflate Compressed Data Format Specification version 1.3. Disponível em: http://www.ietf.org/rfc/rfc1951.txt
[3] - Classe DeflateStream. Disponível em: http://msdn.microsoft.com/pt-br/library/system.io.compression.deflatestream.aspx
[4] - Classe GzipStream Class. Disponível em: http://msdn.microsoft.com/pt-br/library/system.io.compression.gzipstream.aspx
Nenhum comentário:
Postar um comentário