.NET - Descompactando arquivos .zip usando o Shell32 (C#/VB.NET)


Neste artigo eu vou mostrar como podemos descompactar arquivos .zip usando o Shell32 tanto na linguagem VB .NET como na linguagem C#.

Antes da versão 4.5 da plataforma .NET, para descompactar arquivos você tinha que recorrer a biblioteca de terceiros e havia um monte delas disponíveis que faziam esse serviço.

A partir da versão 4.5 a plataforma .NET disponibiliza a classe ZipFile que você pode usar para tratar com arquivos compactados.

Eu pretendo abordar a classe ZipFile em outro artigo porque neste artigo eu vou mostrar como podemos descompactar arquivos usando o Shell32.

Para poder usar os recursos do Shell32 temos que incluir uma referência em nosso projeto a biblioteca COM - Microsoft Shell Controls And Automation (Interop.Shell32.dll) .

Recursos usados:

Criando o projeto Windows Forms

Abra o VS 2013 Express for desktop clique em New Project;

Selecione Visual Basic ->Windows Forms Application, informe o nome Shell32_Unzip e clique no botão OK;

Vamos incluir em nosso projeto uma referência à biblioteca Microsoft Shell Controls And Automation  pois vamos acessar os métodos Namespace e CopyHere do Shell32 para realizar a nossa tarefa.

No menu PROJECT clique em Add Reference;

A seguir clique em Assemblies e selecione Microsoft Shell Controls And Automation marcando-o conforme a figura abaixo:

A seguir vamos incluir no formulário form1.cs a partir da ToolBox os seguintes controles:

Disponha os controles no formulário conforme o leiaute da figura a seguir:

Agora vamos criar declarar no início do formulário os namespaces usados no projeto:

using System.IO;


Agora no evento Click do botão de comando - Descompactar ZIP - inclua o seguinte código:


1-  versão VB .NET
 

     Private Sub btnUnzip_Click(sender As Object, e As EventArgs) Handles btnUnzip.Click

       |'define as variáveis para armazenar o arquivo zip e o destino
        Dim arquivoZip As String = ""
        Dim destino As String = ""

       'verifica se o arquivo zip foi informado
        If txtArquivoZIP.Text = String.Empty Then
            MessageBox.Show("Informe o local e nome do arquivo ZIP", "Arquivo ZIP", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtArquivoZIP.Focus()
            Return
        Else
            arquivoZip = txtArquivoZIP.Text
        End If

     'verifica se o arquivo destino foi definido
        If txtDestino.Text = String.Empty Then
            MessageBox.Show("Informe o local  de destino", "Destino", MessageBoxButtons.OK, MessageBoxIcon.Information)
            txtDestino.Focus()
            Return
        Else
            destino = txtDestino.Text
        End If

        Try
       'chama o método Unzip passando o arquivo zip e o destino
            UnZip(arquivoZip, destino)
            MessageBox.Show("Arquivo descompactado com sucesso", "Unzip", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End Try
    End Sub	

2-  versão C#

private void btnUnzip_Click(object sender, EventArgs e)
{
	//define as variáveis para armazenar o arquivo zip e o destino
	string arquivoZip = "";
	string destino = "";
	//verifica se o arquivo zip foi informado
	if (txtArquivoZIP.Text == string.Empty) {
		MessageBox.Show("Informe o local e nome do arquivo ZIP", "Arquivo ZIP", MessageBoxButtons.OK, MessageBoxIcon.Information);
		txtArquivoZIP.Focus();
		return;
	} else {
		arquivoZip = txtArquivoZIP.Text;
	}
	//verifica se o arquivo destino foi definido
	if (txtDestino.Text == string.Empty) {
		MessageBox.Show("Informe o local  de destino", "Destino", MessageBoxButtons.OK, MessageBoxIcon.Information);
		txtDestino.Focus();
		return;
	} else {
		destino = txtDestino.Text;
	}
	try {
		//chama o método Unzip passando o arquivo zip e o destino
		UnZip(arquivoZip, destino);
		MessageBox.Show("Arquivo descompactado com sucesso", "Unzip", MessageBoxButtons.OK, MessageBoxIcon.Information);
	} catch (Exception ex) {
		MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Information);
	}
}

O código acima é bem simples e já esta comentado.

O destaque fica para o método Unzip() que recebe o arquivo zipado e a pasta de destino para descompactar o ZIP.

O código do método Unzip() é dado abaixo:

 Public Shared Sub UnZip(arquivoZIP As String, pastaDestino As String)
        Try
            'verifica se o arquivo zip existe
            If Not File.Exists(arquivoZIP) Then
                Throw New FileNotFoundException()
            End If
            'verifica se a pasta de destino existe. Se não existir cria
            If Not Directory.Exists(pastaDestino) Then
                Directory.CreateDirectory(pastaDestino)
            End If
            'cria uma instância do objeto Shell32
            Dim objShell As New Shell32.Shell()
            'obtem o destino e o zip 
            Dim diretorioDestino As Shell32.Folder = objShell.NameSpace(pastaDestino)
            Dim arquivoZipOrigem As Shell32.Folder = objShell.NameSpace(arquivoZIP)
            'para cada arquivo no arquivo zip descompacta no destino
            For Each arquivo In arquivoZipOrigem.Items()
                diretorioDestino.CopyHere(arquivo, 4 Or 16)
            Next
        Catch ex As Exception
            Throw
        End Try
    End Sub
     public static void UnZip(string arquivoZIP, string pastaDestino)
     {
	try {
		//verifica se o arquivo zip existe
		if (!File.Exists(arquivoZIP)) {
		     throw new FileNotFoundException();
		}

		//verifica se a pasta de destino existe. Se não existir cria
		if (!Directory.Exists(pastaDestino)) {
		     Directory.CreateDirectory(pastaDestino);
		}

		//cria uma instância do objeto Shell32
		Shell32.Shell objShell = new Shell32.Shell();

		//obtem o destino e o zip 
		Shell32.Folder diretorioDestino = objShell.NameSpace(pastaDestino);
		Shell32.Folder arquivoZipOrigem = objShell.NameSpace(arquivoZIP);

		//para cada arquivo no arquivo zip descompacta no destino
		foreach (void arquivo_loopVariable in arquivoZipOrigem.Items()) 
                          {
		     arquivo = arquivo_loopVariable;
		     diretorioDestino.CopyHere(arquivo, 4 | 16);
		}
	} catch (Exception ex) {
		throw;
	}
     }		
VB .NET C#

Executando o projeto iremos obter o seguinte resultado:

Espiando a pasta de destino verificamos que o arquivo foi descompactado no local como previsto:

Pegue o projeto completo aqui:  Shell32_Unzip.zip

E, porque sois filhos, Deus enviou aos vossos corações o Espírito de seu Filho, que clama: Aba, Pai.
Assim que já não és mais servo, mas filho; e, se és filho, és também herdeiro de Deus por Cristo.

Gálatas 4:6,7

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