C# - Compactando e Descompactando diretórios


Neste artigo veremos como compactar e descompactar diretórios 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.

A classe ZipFile fornece métodos simples para compactar e descompactar diretórios no formato zip. Essa classe é definida no .NET Framework versão 4.5, portanto, este recurso está disponível Visual Studio 2017.

Para usar a classe, você precisa adicionar uma referência à biblioteca System.IO.Compression.FileSystem.

No exemplo deste artigo também vamos usar diretivas para System.IO.Compression e System.IO.

No namespace System.IO.Compression temos os seguintes tipos para compactar e descompactar arquivos e fluxos :

ZipFile  Fornece métodos estáticos para criar, extrair e abrir arquivos zip.
ZipArchive  Representa um pacote de arquivos compactados no formato de arquivo zip
ZipArchiveEntry  Representa um arquivo compactado em um arquivo zip.
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.

Vamos começar mostrando como podemos compactar diretórios, para isso vamos usar o método CreateFromDirectory da classe ZipFile que possui a seguinte sintaxe:

public static void CreateFromDirectory(string diretorioOrigem, string arquivoDestino,
                                                         CompressionLevel
nivelCompressao,bool incluirDiretorioBase)

Onde:

A estrutura de diretórios do sistema de arquivos é preservada no arquivo morto. Se o diretório está vazio, é criado um arquivo vazio.

Se o arquivo já existir, um ocorre uma exceção do tipo IOException. Se uma entrada com o nome especificado já existe no arquivo morto, uma segunda entrada é criada com um nome idêntico.

Se um arquivo no diretório não pode ser adicionado ao arquivo morto, o arquivo ficará incompleto e inválido e o método gera uma exceção IOException.

Recursos usados:

Criando o projeto Windows Forms

Abra o VS Community 2017 clique em New Project;

Selecione Visual C# ->Windows Desktop -> Windows Forms App (.NET Framework), informe o nome CShp_ZipPastas e clique no botão OK;

Vamos incluir em nosso projeto a referência aos namespaces citados.

No menu Project clique em Add Reference e localize e marque os pacotes conforme mostrado abaixo:

No formulário Form1.cs do projeto inclua os seguintes controles a partir da ToolBox:

Disponha os controles conforme o leiaute da figura abaixo:
 

No formulário Form1.cs inclua os seguintes namespaces:

using System;
using System.IO;
using System.IO.Compression;
using System.Windows.Forms;

A seguir no evento Load do formulário inclua o código:

Definimos as configurações iniciais do FolderBrowserDialog e o contéudo dos TextBox para a pasta a ser compactada e do arquivo compactado a ser gerado.

A seguir no evento Click dos botões para localizar a pasta a ser compactada e do arquivo a ser gerado vamos definir o código a seguir:

O código usa o FolderBrowserDialog para definir o diretório a ser compactado e o SaveFileDialog para definir o local onde o arquivo compactado vai ser gravado.

Agora vamos incluir o código para compactar a pasta selecionada no evento Click do botão Compactar :

Usamos o método CreateFromDirectory da classe ZipFile que cria um arquivo zip que contém os arquivos e diretórios do diretório especificado, usa o nível de compactação especificado e opcionalmente inclui o diretório base.

Onde txtDiretorio.Text é caminho da pasta a ser arquivado, especificado como um caminho relativo ou absoluto. Um caminho relativo é interpretado como relativo ao diretório de trabalho atual.

E txtArquivoCompactado.Text representa o caminho do arquivo morto a ser criado, especificado como um caminho relativo ou absoluto. Um caminho relativo é interpretado como relativo ao diretório de trabalho atual.

No exemplo não indicamos o nível de compressão a ser usado.

Para descompactar o arquivo morto gerado usamos o código a seguir no evento Click do botão Descompactar:

Agora usamos o método ExtactToDirectory da classe ZipFile para extrair o conteúdo do arquivo zip gerado.

Agora é só alegria...

Executando o projeto teremos:

Pegue o projeto completo aqui:   CShp_ZipPastas.zip

"E disse-lhe um: Senhor, são poucos os que se salvam? E ele lhe respondeu:
Porfiai por entrar pela porta estreita; porque eu vos digo que muitos procurarão entrar, e não poderão."

Lucas 13:23,24

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti