VB .NET - Compactando e descompactando arquivos
Nas versões anteriores do Visual Basic e mesmo nas versões 1.0 e 1.1 da plataforma .NET era necessário recorrer a componentes de terceiros para realizar a tarefa de compactar e descompactar arquivos. |
Com a versão 2.0 da plataforma .Net este quadro mudou...
A versão 2.0 da plataforma .NET apresenta o namespace Sytem.IO.Compression contém classes que fornecem os serviços básicos para compactar e descompactar streams. As classes são:
DeflateStream | Fornece métodos e propriedades para compactar e descompactar streams usando o algoritmo Deflate |
GZipStream | Fornece métodos e propriedades para compactar e descompactar streams. |
Enumeração: CompressionMode - Especifica se vamos Compactar (Compress) ou descompactar (Decompress) um arquivo stream.
As classes apresentam um comportamento e características similares e são úteis para compactar um fluxo de bytes durante a transferência, como por exemplo, através da rede.
A classe DeflateStream implementa o algoritmo Deflate, veja detalhes em : IETF's RFC 1951. "DEFLATE Compressed Data Format Specification version 1.3.".
A classe GZipStream representa o formato de dados gzip, o qual usa um algoritmo padrão da indústria compactação e descompactação de arquivos. O formato inclui um valor para verificação de redundância cíclica para detectar a corrupção de dados. O formato de dados gzip usa o mesmo algoritmo que a classe DeflateStream, mas pode ser estendida para usar outros formatos de compressão. O formato para gzip esta disponível na RFC 1952, "Gzip". Esta classe não pode ser usada para compactar arquivos maiores que 4 GB.
Objetos GZipStream compactados escritos para um arquivo com extensão .gz podem ser descompactado usando muitos ferramentas de descompactação comuns; porém esta classe não apresenta a funcionalidade de incluir e extrair arquivos a partir de arquivos .zip.
A funcionalidade de compactação em DeflateStream e GZipStream está exposta como um stream onde os dados são lidos byte-a-byte, sendo melhor utilizadas para fonte de dados ainda não compactadas.(Se a fonte de dados já estiver compactada usar estas classes pode fazer com que o arquivo aumente de tamanho)
Para compactar e descompactar arquivos vamos criar duas rotinas : compactaArquivo() e descompactaArquivo() que basicamente interceptam o fluxo de dados (stream) processando os bytes que se movem entre eles e usa a classe GZipStream para realizar a operação. O processo usa um buffer com 4096 bytes para processar os dados do arquivo em pacotes permitindo que mesmo arquivos grandes sejam processados.
Você deve usar os namespaces:
Imports
System.IOImports
System.IO.CompressionImports
System.textAbaixo o código da rotina compactaArquivo() que recebe como parâmetro o arquivo origem e o compacta para o arquivo destino.
Public Sub compactaArquivo(ByVal arquivoOrigem As
String, ByVal arquivoDestino As String) try ' Descompacta a string compactada previamente. primeiro , cria a entrada do arquivo stream Dim streamFonte As New FileStream(arquivoOrigem, FileMode.Open, FileAccess.Read) ' ----- Cria a saida do arquivo stream Dim streamDestino As New FileStream(arquivoDestino, FileMode.Create, FileAccess.Write) ' ----- Os bytes serão processados por um compressor de streams Dim streamCompactado As New GZipStream(streamDestino, CompressionMode.Compress, True) ' ----- Processa os bytes de um arquivo para outro Const tamanhoBloco As Integer = 4096 Dim buffer(tamanhoBloco) As Byte Dim bytesLidos As Integer Do bytesLidos = streamFonte.Read(buffer, 0, tamanhoBloco) If (bytesLidos = 0) Then Exit Do streamCompactado.Write(buffer, 0, bytesLidos) Loop Catch ex As Exception MsgBox(ex.Message) Finally ' ----- Fecha todos os streams streamFonte.Close() streamCompactado.Close() streamDestino.Close() End Try End Sub |
O código da rotina descompactaArquivo() que recebe o arquivo origem a ser descompactado e realiza a operação para um arquivo destino:
Public Sub descompactaArquivo(ByVal arquivoOrigem As
String, ByVal arquivoDestino As String) Try ' ----- Compacata o contéudo do arquivo e ' guarda o resultado em um novo arquivo Dim streamFonte As New FileStream(arquivoOrigem, FileMode.Open, FileAccess.Read) Dim streamDestino As New FileStream(arquivoDestino, FileMode.Create, FileAccess.Write) ' ----- Os bytes serão processados através de um decompressor de stream Dim streamDescompactado As New GZipStream(streamFonte, CompressionMode.Decompress, True) ' ----- Processa os bytes de um arquivo para outro Const tamanhoBloco As Integer = 4096 Dim buffer(tamanhoBloco) As Byte Dim bytesLidos As Integer Do bytesLidos = streamDescompactado.Read(buffer, 0, tamanhoBloco) If (bytesLidos = 0) Then Exit Do streamDestino.Write(buffer, 0, bytesLidos) Loop Catch ex As Exception MsgBox(ex.Message) Finally ' ----- Fecha todos os arquivos streamFonte.Close() streamDescompactado.Close() streamDestino.Close() End Try End Sub |
Vamos criar um novo projeto no VB 2005 Express Edition com o nome compactArquivos e no formulário padrão definir o formulário form1.vb com o seguinte leiaute:
Neste formulário iremos permitir ao usuário efetuar a compactação e descompactação de arquivos usando as funções definidas acima. Para isto vamos incluir no evento Click de cada um dos botões uma chamada as funções?
Private
Sub btnCompactar_Click(ByVal
sender As System.Object,
ByVal e As
System.EventArgs) Handles btnCompactar.Click compactaArquivo(txtCompactarOrigem.Text, txtCompactarDestino.Text) End Sub Private Sub btnDescompactar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDescompactar.Click descompactaArquivo(txtDescompactarOrigem.Text, txtDescompactarDestino.Text) End Sub |
Sugestões para você melhorar o projeto :
Use o componente OpenFileDialog para abrir a caixa de diálogo Abrir Arquivo;
Use a classe FileInfo (método Length) para obter o tamanho do arquivo antes e depois da compactação;
Pegue o projeto completo aqui: compactaArquivos.zip
Até o próximo artigo ...
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#