Ir para o conteúdo

Criar ficheiros ZIP

A .Net framework 3.0 trouxe algumas facilidades na criação de ficheiros ZIP. A classe ZipPackage existente no namespace System.IO.Packaging, em conjunto com algumas instruções do programador, permite facilmente criar ficheiros ZIP com capacidade para incluir quaisquer ficheiros.

Código necessário

Para criar o código é necessário seguir alguns passos, no fim dos quais a aplicação estará pronta a trabalhar!

Adicionar uma referência ao "WindowBase.dll"

Basta ir ao Solution Explorer, abrir o item "My Project" e no separador "References", clicar no botão "Add Reference". Aparece uma janela, e no separador ".NET", basta seleccionar nessa lista a referência "WindowBase". No caso da referência não se encontrar na lista, é necessário indicar onde está o dll correspondente: clicar no separador "Browse" e escolher o caminho:

C:\Programas\Reference Assemblies\Microsoft\Framework\v3.0

Em que C:\Programas corresponde à pasta de instalação de programas, por omissão. No caso de não se encontrar nessa pasta, será necessário procurar em pastas de sistema, ou na que corresponde à instalação da .Net Framework.

Importar o namespace necessário

Após importar o dll necessário, tem de se importar o namespace onde está a classe ZipPackage. Basta colocar uma linha no topo do ficheiro:

Imports System.IO.Packaging

Escrever algum código

Por fim, é necessário adicionar algum código para que tudo funcione:

    ''' <summary>
    ''' Cria um ficheiro ZIP, com alguns ficheiros
    ''' </summary>
    ''' <param name="zipFile">Caminho para o ficheiro ZIP (String)</param>
    ''' <param name="files">Caminho para os ficheiros a serem incluídos no ficheiro ZIP (Array String)</param>
    Private Sub ZipFiles(ByVal zipFile As String, ByVal files() As String)
        Try
            ' Abrir o ficheiro ZIP se ele existir, caso contrário é criado
            Dim zip As Package = ZipPackage.Open(zipFile, _
              IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)

            ' Adicionar os ficheiros da lista
            for each file in files
                AddToArchive(zip, file)
            Next

            zip.Close() ' Fechar o ficheiro ZIP
        Catch ex As Exception
            MsgBox("Ocorreu um erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub

    ''' <summary>
    ''' Adiciona um ficheiro aos ficheiro ZIP
    ''' </summary>
    ''' <param name="zip">O objecto correspondente ao ficheiro ZIP</param>
    ''' <param name="fileToAdd">Caminho para o ficheiro a ser incluído no ficheiro ZIP (String)</param>
    Private Sub AddToArchive(ByVal zip As Package, _
                         ByVal fileToAdd As String)

        ' Trocar os espaços por underscores (_)
        Dim uriFileName As String = fileToAdd.Replace(" ", "_")

        ' Um caminho começa sempre por uma barra "/" 
        Dim zipUri As String = String.Concat("/", _
                   IO.Path.GetFileName(uriFileName))

        Dim partUri As New Uri(zipUri, UriKind.Relative)
        Dim contentType As String = _
                   Net.Mime.MediaTypeNames.Application.Zip

        ' A classe PackagePart contém informação:
        ' - Em que pasta extrair cada ficheiro, o seu caminho interno no ZIP (partUri)
        ' - Tipo de conteúdo do ficheiro, o MIME type (contentType) 
        ' - Tipo de compressão (CompressionOption.Normal)   
        Dim pkgPart As PackagePart = zip.CreatePart(partUri, _
                   contentType, CompressionOption.Normal)

        ' Ler todos os bytes do ficheiro a ser arquivado
        Dim bites As Byte() = IO.File.ReadAllBytes(fileToAdd)

        ' Comprimir e escrever efectivamente os bytes dentro do ficheiro ZIP
        pkgPart.GetStream().Write(bites, 0, bites.Length)

    End Sub

Estas duas funções permitem criar e adicionar ficheiros a um ficheiro ZIP, respectivamente.

Pontos a considerar

Ao abrir ficheiros ZIP criados com método noutro utilitário, como por exemplo o WinZip, é normal encontrar ficheiros do género [Tipo_conteúdos].xml. Infelizmente, não é possível controlar a presença deste ficheiro. É um ficheiro que incluí informação relativa aos tipos de ficheiros incluídos no ZIP, tais como "txt" para um ficheiro de texto, ou "doc" para um documento do MS Word, etc.

Adicionalmente, ao tentar definir quaisquer propriedades para o objecto PackagePart (pkgPart.Package.PackageProperties), irão aparecer outros ficheiros no ficheiro ZIP, tais como ###.psmdcp (onde ### é uma sequência numérica aleatória). Este ficheiro contém metadados correspondentes às opções definidas no objecto; e um ficheiro .rels, que é um ficheiro XML que contém metadados sobre relações do package.

Licença

Artigo traduzido do original em inglês, escrito por VB Rocks, em http://www.codeproject.com/KB/vb/ZipDemo.aspx