CódigoFonte.net Inicial Anuncie Buscar códigos Fale conosco Olá Visitante - Segunda Feira, 12 de Maio de 2008.



Códigos
ASP.NET
ASP
Cold Fusion
CGI
C#
JavaScript
Delphi
PHP
VB.NET
VBScript
XML
Assistentes
Favoritos
Botão Direito
Confirm Box
Datas
Caixa de Alerta
Transições
Cores em Hexa
Links
Ver + Detalhes
Tutoriais/Dicas
ASP
Banco de dados
BLOGs
CGI/Perl
C# (CSharp)
CSS
Delphi
.NET
Flash
Front-Page
HTML
JavaScript
PHP
Python
Web
Web 2.0
Windows
Serviços
Mural
Contadores
Web Objects
GamesDaNet
Chama MSN
Jogos Online
Feed RSS
Expediente
Anuncie
Fórum
Bate-papo
Orkut
Divulgue-nos
Privacidade
Contato
Parceiros
Fontes Gratis
Br-Designer.com
CompreDeTudo
Iscambo.com
Garu Downloads
Oficina da Net
Seus Sonhos
.NET User Group
Piadas online
Casa dos Wm
HTML Staff
BaixaTube




Dicas CódigoFonte.net
Quinta Feira, 28 de Dezembro de 2006

VB 2005 - 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
que contém classes para o fornecimento de 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.

E as enumerações:

CompressionMode - Especifica se vamos Compactar (Compreess) 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 de 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 descompactados usando muitas 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.IO
Imports System.IO.Compression
Imports System.text


Abaixo 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 layout:

imagem_1-

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 às 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;

Referências:
http://msdn2.microsoft.com/en-us/library/system.io.compression.aspx

<a href='http://www.codigofonte.net/scripts-1395/compactacao-de-dados-em-vbnet'>Baixe este exemplo completo</a>

Por José Carlos Macoratti - www.macoratti.net

Veja mais

Comentários do artigo [Novo comentário]

Nenhum comentário, seja o primeiro a comentar.
Para adicionar um comentário você deve efetuar o login
Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:



» Busca específica

BuscaPé, líder em comparação de preços na América Latina





» Notebooks?
» Procurando o que comprar? CompreDeTudo.com


Melhor Visualizado com
800x600 de Resolução
CodigoFonte.net » CodigoFonte.eti.br » CompreDeTudo.com » MeuMural.com.br » Todos os Direitos Reservados © 2002/2008