Como compactar um arquivo em .NET 2.0

Veja como é fácil, em menos de 5 linhas de código você pode compactar qualquer arquivo…

const string pathArquivo = @”D:\dotNET\VBCSharpWP.doc”;
const string pathArquivoCompactado = @”D:\dotNET\VBCSharpWP.zip”;
const string pathArquivoDescompactado = @”D:\dotNET\VBCSharpWP1.doc”;

//Compacta
byte[] bufferArquivo = File.ReadAllBytes(pathArquivo);
using( FileStream fs = File.Create(pathArquivoCompactado) )
{
using (GZipStream gzip = new GZipStream(fs, CompressionMode.Compress, false))
{
gzip.Write(bufferArquivo, 0, bufferArquivo.Length);
}
}

//Descompacta
using ( FileStream fs = File.OpenRead(pathArquivoCompactado) )
{
using( GZipStream gdzip = new GZipStream(fs, CompressionMode.Decompress, true) )
{
//Recupera o tamanho do arquivo original antes de zippar.
//Ps: Seguindo o que esta descrito no “RFC 1952 GZIP file format specification version 4.3″
//http://www.gzip.org/zlib/rfc-gzip.html
//Esta informação esta no final do arquivo nos ultimos 4 bytes.

//Vai para a posição onde esta o tamanho do arquivo original.
fs.Position = (int)fs.Length - 4;

//Recupera o tamanho do arquivo original
byte[] bufferTamanhoDestino = new byte[4];
fs.Read(bufferTamanhoDestino, 0, 4);
int tamanhoBufferSaida = BitConverter.ToInt32(bufferTamanhoDestino, 0);

//Inicializa o buffer que vai receber o arquivo descompactando
byte[] bufferSaida = new byte[tamanhoBufferSaida + 100];

//Volta para o início do arquivo
fs.Position = 0;

int readOffset = 0;
int totalBytes = 0;

//Percorre o stream e joga para o buffer de saída.
int bytesRead;
while ((bytesRead = gdzip.Read(bufferSaida, readOffset, 100)) != 0)
{
readOffset += bytesRead;
totalBytes += bytesRead;
}
//Escreve o buffer para o arquivo de saída.
File.WriteAllBytes(pathArquivoDescompactado, bufferSaida);
}
}

Aqui em VB.NET

‘Compacta

Dim fs As FileStream
Dim bufferArquivo As Byte() = File.ReadAllBytes(”D:\dotNET\VBCSharpWP.doc”)
Using fs = File.Create(”D:\dotNET\VBCSharpWP.zip”)
Using gzip As GZipStream = New GZipStream(fs, CompressionMode.Compress, False)
gzip.Write(bufferArquivo, 0, bufferArquivo.Length)
End Using
End Using

‘Descompacta
Using fs = File.OpenRead(”D:\dotNET\VBCSharpWP.zip”)
Using gdzip As GZipStream = New GZipStream(fs, CompressionMode.Decompress, True)
Dim bytesRead As Integer
fs.Position = (CInt(fs.Length) - 4)
Dim bufferTamanhoDestino As Byte() = New Byte(4 - 1) {}
fs.Read(bufferTamanhoDestino, 0, 4)
Dim tamanhoBufferSaida As Integer = BitConverter.ToInt32(bufferTamanhoDestino, 0)
Dim bufferSaida As Byte() = New Byte((tamanhoBufferSaida + 100) - 1) {}
fs.Position = 0
Dim readOffset As Integer = 0
Dim totalBytes As Integer = 0
Do While (bytesRead = gdzip.Read(bufferSaida, readOffset, 100) <> 0)
readOffset = (readOffset + bytesRead)
totalBytes = (totalBytes + bytesRead)
Loop
File.WriteAllBytes(”D:\dotNET\VBCSharpWP1.doc”, bufferSaida)
End Using
End Using

Enviar por e-mail. Hits para esta publicação: 1456.

3 Comentários »

  1. Fernando Dantas disse,

    28 de Fevereiro de 2007 @ 11:37

    Gostei desse assunto e código para compactar.. abraços!

  2. Rebeca Magluf Rosa disse,

    20 de Abril de 2007 @ 12:58

    Usei este exemplo, com mais 4 bem parecidos, mas sempre me dá esta mensagem de erro e não consigo entender pq:
    “O número mágico no cabeçalho GZip não está correto. Verifique se você está transmitindo um fluxo GZip.”

    Será que vcs poderia me ajudar com este problema??
    Estou com uma certa urgência neste projeto e não consigo usar o gzipstream. O único exemplo qe funcionou redondinho foi de uma dll de fora e não nativo do VB.net

    Aguardando por uma resposta
    Atenciosamente,
    Rebeca

  3. Tatiana disse,

    20 de Junho de 2007 @ 15:30

    oi gostaria de saber como faço para fazer para compactar pastas em vez de arquivos.

RSS para comentários nesta publicação · URI para link desta publicação:

Deixe um Comentário