Compactando e Descompactando Arquivos com a classe GZipStream

 

Tarefas de compactar e descompactar arquivos são essenciais no nosso dia-dia. A .NET Framework 2.0 possui o namespace Sytem.IO.Compression que contém classes para compactar e descompactar streams. Neste artigo, vamos abordar a clase GZipStream que possui métodos e propriedades para compactar e descompactar streams.

        

Inicie o Visual Studio.Net e adicione um novo projeto com o nome: CompactarArquivos.

 

comdesarqfig01.JPG

Figura 1 – Adicionando um novo projeto.

 

Adicione alguns controles (textbox, botões e groupbox) ao formulário de forma que fique semelhante à imagem abaixo:

 

comdesarqfig02.JPG

Figura 2 – Formulário modelo do artigo.

 

Neste formulário temos dois componentes GroupBox para agrupar as funções de compactação e descompactação respectivamente. Em cada groupbox existem duas caixas de textos que contém o caminho do arquivo de origem e destino. Ainda temos os botões: Abrir Arquivo que abre uma janela de dialogo (OpenFileDialog)  onde o usuário seleciona o arquivo que será compactado ou descompactado e  os botões: Compactar Para e Descompactar Para, que abre uma janela de dialogo (SaveFileDialog) onde o usuário selecionará o caminho e o nome do arquivo para ser compactado ou descompactado. Por ultimo temos os botões Compactar e Descompactar onde o usuário executa as respectivas funções de compactação e descompactação após ter selecionado a origem e destino dos arquivos.

        

Para manipular arquivos e trabalhar com as classes de compressão devemos importas as namespaces System.IO e System.IO.Compression respectivamente.

 

Imports System.IO

Imports System.IO.Compression

Figura 3 - Importando as namespaces de acesso a arquivos e compressão.

Para compactar e descompactar arquivos vamos um método chamado,  compactacaoArquivo() que receberá como parâmetros duas strings contendo a Origem e Destinos dos arquivos e um inteiro informando o tipo(0 para compactar e 1 para descompactar). Veja na imagem abaixo o código do método compactacaoArquivo().

    Public Function compactacaoArquivo(ByVal Origem As String, ByVal Destino As String, ByVal tipo As Integer)

 

        'cria as streams de origem e destino do arquivo

        Dim o As New FileStream(Origem, FileMode.Open, FileAccess.Read)

        Dim d As New FileStream(Destino, FileMode.Create, FileAccess.Write)

 

        'cria um objeto gzstream para ser compactado

        Dim arquivoCompactado As GZipStream

 

        If tipo = 0 Then 'modo compress

            arquivoCompactado = New GZipStream(d, CompressionMode.Compress, True)

 

        Else 'modo descompress

            arquivoCompactado = New GZipStream(d, CompressionMode.Decompress, True)

 

        End If

 

        'buffer e bytes lidos de um arquivo origem para um outro de destino

        Dim buffer(4096) As Byte

        Dim Lidos As Integer

 

        Try

 

            While Lidos <> 0

                Lidos = o.Read(buffer, 0, 4096)

                arquivoCompactado.Write(buffer, 0, Lidos)

            End While

 

            Return True

        Catch ex As Exception

            Return False

        Finally

            'fecha todas as streams

            o.Close()

            d.Close()

            arquivoCompactado.Close()

        End Try

 

    End Function

Figura 4 - Codificação do Método para Compactar e Descompactar arquivos.

Adicione dois controles OpenFileDialog e SaveFileDialog ao formulário.

Esses componentes serão responsáveis por localizar o arquivo de origem e de destino das funções de compactar e descompactar. Quando o usuário clicar no botão OK dessas janelas de diálogos, o caminho do arquivo selecionado será armazenados nas textbox de Origem e Destino.

 

comdesarqfig03.JPG

Figura 5 – Aba Dialogs da toolbox.

 

Veja o código para abrir uma janela de dialogo e inserir o arquivo selecionado em uma textbox.

 

    Private Sub btCompactarOrigem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCompactarOrigem.Click

        OpenFileDialog1.ShowDialog() 'abre a janela de dialogo

        txtCompactarOrigem.Text = OpenFileDialog1.FileName 'retorna o caminho do arquivo selecionado

    End Sub

 

    Private Sub btCompactarDestino_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCompactarDestino.Click

        SaveFileDialog1.ShowDialog()

        txtCompactarDestino.Text = SaveFileDialog1.FileName

    End Sub

 

    Private Sub btDescompactarOrigem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDescompactarOrigem.Click

        OpenFileDialog2.ShowDialog()

        txtDescompactarOrigem.Text = OpenFileDialog2.FileName

    End Sub

 

    Private Sub btDescompactarDestino_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDescompactarDestino.Click

        SaveFileDialog2.ShowDialog()

        txtDescompactarDestino.Text = SaveFileDialog2.FileName

    End Sub

Figura 6 – Abrindo as janelas de diálogos.

 

Para finalizar, temos os códigos do botões Compactar e Descompactar.

 

    Private Sub btExecutarCompactar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExecutarCompactar.Click

        If compactacaoArquivo(Me.txtCompactarOrigem.Text, Me.txtCompactarDestino.Text, 0) = True Then

            MsgBox("Arquivo Compactado")

        Else

            MsgBox("Erro ao compactar o arquivo")

        End If

    End Sub

 

    Private Sub btExecutarDescompactar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExecutarDescompactar.Click

        If compactacaoArquivo(Me.txtDescompactarOrigem.Text, Me.txtDescompactarDestino.Text, 1) = True Then

            MsgBox("Arquivo descompactado")

        Else

            MsgBox("Erro ao descompactar o arquivo")

        End If

    End Sub

Figura 7 – Executando o Método de Compactação de Arquivo.

 

Agora é hora de executar a aplicação. Se tudo ocorrer corretamente teremos o seguinte resultado:

 

comdesarqfig04.JPG

Figura 8 – Executando a aplicação.

 

Chegamos ao final do artigo. Até o próximo