Desenvolvimento - Visual Basic .NET

Compactar de Descompactar arquivos

Compactação e descompactação de arquivos utilizando o vb.net 2005.

por Thiago do Nascimento Longchamps



Atualizado em 23 de julho de 2009.

Depois do artigo sobre a realização de backup no SQL Server via código, me fizeram a seguinte observação: "Mesmo sendo gerado pelo sistema, o usuário ainda precisa compactar o copiar o backup para outra unidade.". Realmente, em vários momentos, seria ideal realizar uma compactação dos arquivos para que possamos enviá-lo por e-mail, disponibilizá-lo para download ou mesmo para o armazenamento dos arquivos de backup.

Nesse artigo, iremos abordar exatamente essa tarefa! COMPACTAÇÃO E DESCOMPACTAÇÃO DE ARQUIVOS.

Colocando a mão na massa

Primeiro, vamos criar um projeto Windows forms, e no form1 vamos incluir os seguintes controles:

Name Tipo Text
LblArquivoCompactar Label Arquivo a ser compactado
TxtArquivoCompactar Textbox
LblArquivoDescompactar Label Arquivo a ser descompactado
TxtArquivoDescompactar Textbox
BtnCompactar Button Compactar
BtnDescompactar Button Descompactar


O form1 deve ficar com esta cara:



Rotina para compactar o arquivo

No clique do botão BtnCompactar, insira o código abaixo:
    Private Sub BtnCompactar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
	Handles BtnCompactar.Click
        "<Selecionar o arquivo a ser compactado>
        Dim LDlg As New OpenFileDialog()
        If LDlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
            Exit Sub
        Else
            TxtArquivoCompactar.Text = LDlg.FileName
        End If
        "</Selecionar o arquivo a ser compactado>

        "<Processo de compatação>
        Try
            "Arquivo Original
            Dim LSteOrigem As New System.IO.FileStream(TxtArquivoCompactar.Text, _
			System.IO.FileMode.Open, System.IO.FileAccess.Read)

            "Arquivo de destino
            Dim LSteDestino As New System.IO.FileStream(TxtArquivoCompactar.Text & ".gz", 
			System.IO.FileMode.Create, System.IO.FileAccess.Write)

            "Stream que irá comprimir os dados
            Dim LSteCompactador As New System.IO.Compression.GZipStream(LSteDestino, 
			System.IO.Compression.CompressionMode.Compress, True)

            Dim LBytBloco(500) As Byte
            Dim LIntLido As Integer = 0

            Do
                LIntLido = LSteOrigem.Read(LBytBloco, 0, 500)
                If (LIntLido <> 0) Then
                    LSteCompactador.Write(LBytBloco, 0, LIntLido)
                Else
                    Exit Do
                End If
            Loop
            LSteOrigem.Close()
            LSteCompactador.Close()
            LSteDestino.Close()
        Catch ex As Exception
            MessageBox.Show("Houve um erro na compactação de arquivos." & _
			ex.Message, "Erro", MessageBoxButtons.OK)
            Exit Sub
        End Try
        MessageBox.Show("Arquivo compactado.", "Concluído", MessageBoxButtons.OK, MessageBoxIcon.Information)
        "</Processo de compatação>
    End Sub

Rotina para descompactar o arquivo

No clique do botão BtnDescompactar, insira o código abaixo:
    Private Sub BtnDescompactar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
	Handles BtnDescompactar.Click
        "<Selecionar o arquivo a ser descompactado>
        Dim LDlg As New OpenFileDialog()
        If LDlg.ShowDialog() <> Windows.Forms.DialogResult.OK Then
            Exit Sub
        Else
            TxtArquivoDescompactar.Text = LDlg.FileName
        End If
        "</Selecionar o arquivo a ser compactado>

        "<Processo de descompatação>
        Try
            "Arquivo Original
            Dim LSteOrigem As New System.IO.FileStream(TxtArquivoDescompactar.Text, _
			System.IO.FileMode.Open, System.IO.FileAccess.Read)

            "Arquivo de destino
            Dim LSteDestino As New System.IO.FileStream(TxtArquivoDescompactar.Text.Replace(".gz", ""), _
			System.IO.FileMode.Create, System.IO.FileAccess.Write)

            "Stream que irá comprimir os dados
            Dim LSteCompactador As New System.IO.Compression.GZipStream(LSteOrigem, _
			System.IO.Compression.CompressionMode.Decompress, True)

            Dim LBytBloco(500) As Byte
            Dim LIntLido As Integer = 0

            Do
                LIntLido = LSteCompactador.Read(LBytBloco, 0, 500)
                If (LIntLido <> 0) Then
                    LSteDestino.Write(LBytBloco, 0, LIntLido)
                Else
                    Exit Do
                End If
            Loop
            LSteOrigem.Close()
            LSteCompactador.Close()
            LSteDestino.Close()
        Catch ex As Exception
            MessageBox.Show("Houve um erro na descompactação de arquivos." & _
			ex.Message, "Erro", MessageBoxButtons.OK)
            Exit Sub
        End Try
        MessageBox.Show("Arquivo descompactado.", "Concluído", MessageBoxButtons.OK, MessageBoxIcon.Information)        
"</Processo de descompatação>
    End Sub

Testando a aplicação

Rodando a aplicação, podemos ver o resultado da compactação de descompactação do arquivo. É bom lembrar, que o formato gerado pela classe do framework também é reconhecido pelo winzip e winrar.

Conclusão

De maneira bem simples e sem adicionar nenhuma biblioteca ou controle de terceiros, conseguimos compactar de descompactar arquivos de uma maneira transparente para o usuário.

Ok, OK. Vocês devem estar se perguntando: Como fazer para compactar 2 ou mais arquivos de uma vez? A resposta é: Infelizmente, com essa classe não conseguimos executar essa tarefa sem utilizar de alguns artifícios e um pouco de criatividade. Mas se você não quiser gastar muito tempo para implementar a solução para vários arquivos, existem várias dlls, como ChilkatDotNet2, UnRar que já executam esta tarefa.
Thiago do Nascimento Longchamps

Thiago do Nascimento Longchamps - Atuando a oito anos na área de desenvolvimento de sistemas e banco de dados, foi gerente de sistemas de uma grande empresa de telemarketing e há dois anos, montou a Phibra Informática, empresa especializada em consultoria e desenvolvimento de software.