Back-End

13 dez, 2018

C# – Compactando e descompactando diretórios

Publicidade

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 no Visual Studio 2017.

Para usar a classe, você precisa adicionar uma referência à biblioteca System.IO.Compression.FileSystem. No exemplo deste artigo também usaremos diretivas para System.IO.Compression e System.IO.

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

Começaremos 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:

  • diretorioOrigem: o caminho para o diretório a ser arquivado
  • arquivoDestino: o caminho do arquivo morto a ser criado, especificado como um caminho relativo ou absoluto
  • nivelCompressao: um dos valores de enumeração que indica se é necessário enfatizar a eficiência de compactação ou velocidade ao criar a entrada
  • incluirDiretorioBase: true inclui o nome do diretório de diretorioOrigem na raiz do arquivo morto, e false inclui somente o conteúdo do diretório

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, em um ocorre uma exceção do tipo IOException, e 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 e clique em New Project. Em seguida, selecione Visual C# > Windows Desktop > Windows Forms App (.NET Framework), informe o nome CShp_ZipPastas e clique no botão OK:

Incluiremos 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:

  • 2 Labels
  • 1 TextBox – txtDiretorio
  • 1 Button – btnLocalizarPasta
  • 1 TextBox – txtArquivoCompactado
  • 1 Button – btnLocalizarArquivo
  • 2 Buttons – btnCompactar e btnDescompactar
  • 1 FolderBrowserDialog – fdbdlg1
  • 1 SaveFileDialog – svfdlg1

Disponha os controles conforme o layout 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 conteúdo 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 será gravado.

Agora incluiremos 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