C# - Criando e extraindo arquivos .ZIP


Neste artigo veremos como usar criar e extrair arquivos .zip usando a biblioteca DotNetZip via Nuget em uma aplicação Windows Forms usando a linguagem C#.

Se você precisar compactar e descompactar arquivos na plataforma .NET pode usar os recursos do namespace Sytem.IO.Compression que contém classes que fornecem os 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.

Além desse recurso nativo você também pode usar bibliotecas disponíveis para realizar a mesma tarefa.

As bibliotecas mais conhecidas para realizar a criação e extração de arquivos são : DotNetZip and SharpZipLib.

A biblioteca SharpZipLib (anteriormente ZZipLib) é uma biblioteca Zip, GZip, Tar e BZip2 inteiramente escrita em C# para a plataforma .NET. Ela é implementada como um assembly(instalável no GAC), e, portanto, pode ser facilmente incorporada em outros projetos em qualquer linguagem .NET.

A DotNetZip é uma biblioteca de classes gratuita que oferece um ótimo desempenho e um conjunto de ferramentas para a manipulação de arquivos zip que pode usar usada com qualquer linguagem suportada plataforma .NET.

Neste artigo eu vou mostrar como podemos usar a biblioteca DotNetZip para criar e extrair arquivos .zip.

Recursos usados:

Criando o projeto Windows Forms

Abra o VS Community 2013 clique em New Project;

Selecione Visual C# ->Windows Forms Application, informe o nome CriandoExtraindo_ZIP e clique no botão OK;

Vamos incluir em nosso projeto o pacote DotNetZip clicando no menu TOOLS e a seguir em Nuget Package Manager -> Manage Nuget Package for Solution;

Selecione o pacote DotNetZip e clique em Install;

No menu PROJECT clique em Add Class e informe o nome ZipZap para a classe que estamos incluindo no projeto.

Agora vamos criar dois métodos estáticos nesta classe, mas antes precisamos definir os seguintes namespaces:

using Ionic.Zip;

using System;

using System.Collections.Generic;

using System.IO;

 

O namespace Ionic.Zip é o que nos dá acesso aos recursos da biblioteca DotNetZip para criar e extrair arquivos zip.

1- O método CriarArquivoZip(List<string> itens, string Arquivodestino) cujo código vemos a seguir:

 public static void CriarArquivoZip(List<string> arquivos, string ArquivoDestino)
        {
            using (ZipFile zip = new ZipFile())
            {
                // percorre todos os arquivos da lista
                foreach (string item in arquivos)
                {
                    // se o item é um arquivo
                    if (File.Exists(item))
                    {
                        try
                        {
                            // Adiciona o arquivo na pasta raiz dentro do arquivo zip
                            zip.AddFile(item, "");
                        }
                        catch 
                        {
                            throw;
                        }
                    }
                    // se o item é uma pasta
                    else if (Directory.Exists(item))
                    {
                        try
                        {
                            // Adiciona a pasta no arquivo zip com o nome da pasta 
                            zip.AddDirectory(item, new DirectoryInfo(item).Name);
                        }
                        catch 
                        {
                            throw;
                        }
                    }
                }
                // Salva o arquivo zip para o destino
                try
                {
                    zip.Save(ArquivoDestino);
                }
                catch
                {
                    throw;
                }
            }
        }

Este método recebe uma lista de arquivos para gerar o arquivo ZIP e o nome e local de destino do arquivo.

No código criamos uma instância da classe ZipFile e usamos os seguintes métodos:

2- O método ExtrairArquivoZip(string localizacaoArquivoZip, string destino) que possui o seguinte código:

 public static void ExtrairArquivoZip(string localizacaoArquivoZip, string destino)
        {
            if (File.Exists(localizacaoArquivoZip))
            {
                //recebe a localização do arquivo zip
                using (ZipFile zip = new ZipFile(localizacaoArquivoZip))
                {
                    //verifica se o destino existe
                    if (Directory.Exists(destino))
                    {
                        try
                        {
                            //extrai o arquivo zip para o destino
                            zip.ExtractAll(destino);
                        }
                        catch
                        {
                            throw;
                        }
                    }
                    else
                    {
                        //lança uma exceção se o destino não existe
                        throw new DirectoryNotFoundException("O arquivo destino não foi localizado");
                    }
                }
            }
            else
            {
                //lança uma exceção se a origem não existe
                throw new FileNotFoundException("O Arquivo Zip não foi localizado");
            }
        }

Este método recebe o local e nome do arquivo ZIP e o local de destino para onde os arquivos deverão ser extraídos.

No código criamos uma instância da classe ZipFile() usando a sobrecarga onde passamos o nome e local do arquivo ZIP.

A seguir usamos o método ExtracAll() para extrair os arquivos do arquivo zipado.

Para testar a nossa classe vamos definir no formulário uma interface contendo um controle TabControl chamado tabControlZip que contém duas abas TabPages:

  1. Criar Arquivo ZIP

  2. Extrair Arquivo ZIP

Abaixo vemos o leiaute da interface mostrando as duas TabPages:

Eu não vou entrar em detalhes dos controles usados na interface visto que o exemplo completo poderá ser baixado no final do artigo.

1- A funcionalidade para criar um arquivo ZIP funciona assim:

O usuário deve informar o diretório de destino e a seguir informar o nome do arquivo ZIP a ser gerado.

Depois o usuário poderá selecionar os arquivos que deseja compactar no arquivo ZIP.

Após isso basta clicar no botão PROCESSAR para gerar o arquivo zip. Abaixo vemos o código do evento Click deste botão:

  private void btnCriarZIP_Click(object sender, EventArgs e)
  {
            if (!txtNomeArquivoZIP.Text.Contains(".zip"))
            {
                MessageBox.Show("O nome do arquivo deve possuir a extensão .zip");
                txtNomeArquivoZIP.Focus();
                return;
            }
            try
            {
                string localNomeDestinoZIP = txtDestino.Text + "\\" + txtNomeArquivoZIP.Text;
                ZipZap.CriarArquivoZip(arquivos, localNomeDestinoZIP);
                MessageBox.Show("Os arquivos selecionados forma compactados em \n\n " +
                              localNomeDestinoZIP);
            }
            catch(Exception ex) 
            {
                MessageBox.Show("Ocorreu um erro ao criar arquivo ZIP \n\n" + ex.Message);
            }
 }

No código estamos usando o método CriarArquivo() da classe ZipZap e informando a relação de arquivos e o local e nome do arquivo ZIP a ser gerado.

2- A funcionalidade para extrair um arquivo ZIP funciona assim:

O usuário informa o nome e local do arquivo ZIP e a seguir o local de destino para onde os arquivos deverão ser extraídos.

Após isso basta clicar no botão Extrair conteúdo do arquivo ZIP cujo código do evento Click é visto a seguir:

   private void btnExtrairZIP_Click(object sender, EventArgs e)
   {
            try
            {
                ZipZap.ExtrairArquivoZip(txtLocalizacaoArquivoZIP.Text, txtDestinoZIP.Text);
                MessageBox.Show("A arquivo\n\n " + txtLocalizacaoArquivoZIP.Text + 
                                          "foi extraído com sucesso na pasta \n\n" + txtDestinoZIP.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocorreu um erro ao extrair o arquivo ZIP.\n\n " + ex.Message);
            }
   }

O código usa o método ExtrairArquivo() da classe ZipZap onde informamos o nome e local do arquivo ZIP e o local de destino para onde os arquivos serão extraídos.

Executando o projeto e realizando a criação de um arquivo ZIP vemos a seguir o resultado obtido :

Pegue o projeto completo aqui:  CriandoExtraindo_ZIP.zip

De sorte que haja em vós o mesmo sentimento que houve também em Cristo Jesus,
Que, sendo em forma de Deus, não teve por usurpação ser igual a Deus,
Mas esvaziou-se a si mesmo, tomando a forma de servo, fazendo-se semelhante aos homens;
E, achado na forma de homem, humilhou-se a si mesmo, sendo obediente até à morte, e morte de cruz.

Filipenses 2:5-8

Referências:


José Carlos Macoratti