Usando C# com a biblioteca SharpZipLib - Um forma rápida e fácil de compactar arquivos

Postado por: Tiago Lemos em 28th out, 2008 | Categoria: ASP.NET, C#

Está precisando compactar arquivos para a extensão .zip e não sabe como fazer isso?

A SharpZibLib (#ZipLib) é uma biblioteca que permitir compactar arquivos para os formatos: Zip, GZip, Tar e BZip2. É uma biblioteca toda escrita em C#, mas que pode ser utilizada em qualquer linguagem da plataforma .NET. Com essa biblioteca nós podemos compactar arquivos e determinar alguns parâmetros de configuração como por exemplo, nível de compactação, password e outros.

Mas como utilizar essa biblioteca?

Primeiro adicionamos a ICSharpCode.SharpZipLib.dll a pasta bin da solution, recompilamos o projeto e então continuamos com os seguintes códigos:

1 - Importe a biblioteca em sua página

using ICSharpCode.SharpZipLib.Zip;

2 - Crie um arquivo utilizando a classe File (o arquivo deve ter o nome com a extensão .zip). Declare um objeto do tipo ZipOutputStream passando como parâmetro o arquivo que acabamos de criar. Defina o grau de compactação do Zip (1 à 9). Finalize o arquivo e feche o mesmo.

ZipOutputStream zipOutPut = new ZipOutputStream(File.Create("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip"));
//Compactação level 9
zipOutPut.SetLevel(9);
zipOutPut.Finish();
zipOutPut.Close();

3 - Declare um objeto do tipo ZipFile passando como parâmetro o arquivo zip que foi criado acima. Libere o zip para receber arquivos.

ZipFile zip = new ZipFile("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip");
//Inicia a criação do ZIP
zip.BeginUpdate();

4 - Após liberar o zip para receber arquivos, basta adicionar o arquivos de qualquer formato ao ZipFile

//Adicionando arquivos previamente criados ao zipFile
string nomeZIP = "C:/temp/NomeArquivo.txt";
zip.NameTransform = new ZipNameTransform(nomeZIP.Substring(0, nomeZIP.LastIndexOf("/")));
zip.Add(nomeZIP);

nomeZIP = "C:/temp/NomeArquivo2.xls";
zip.NameTransform = new ZipNameTransform(nomeZIP.Substring(0, nomeZIP.LastIndexOf("/")));
zip.Add(nomeZIP);

5- Grave as ações realizadas no zip e feche o arquivo

zip.CommitUpdate();
zip.Close();

6 - Faça as alterações no ContentType para devolver o arquivo zip para o usuário

HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = false;
HttpContext.Current.Response.ContentType = "application/octet-stream";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=NomeDoArquivo.zip");

7 - Crie um FileStream e um array de Byte, para poder retornar o zip para o usuário

FileStream inStr = null;
byte[] buffer = new byte[1024];
long byteCount;

8 - Leia o arquivo zip que foi criado no FileStream instanciado anteriormente. Percorra o FileStream até o final. Verifique se o usuário está conectado, se estiver escreva o arquivo para usuário e atualize a página.

inStr = File.OpenRead("D:/Projetos/Exemplos/CSharp/ZIP/NomeDoArquivo.zip");
while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0)
{
    if (Context.Response.IsClientConnected)
    {
        Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        Context.Response.Flush();
    }
}
Response.End();

Espero que todos tenham gostado. Em breve tem mais.