.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:
2 Labels
1 TextBox - name = txtArquivoZIP
1 TextBox - name = txtDestino
1 Button - name = btnUnzip
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 destinoDim 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: