VB.NET - Arquivos Zip
Comprimir múltiplos arquivos nunca foi tão fácil, como é agora com o uso do .NET Framework 3.0. Usando a nova classe ZipPackage do namespace System.IO.Packging e algumas linhas código, você pode criar um arquivo .zip com múltiplos arquivos.
Usando o código
Adicione uma referência ao “WindowsBase.dll”, clique com o botão direito do mouse sobre o projeto e clique em Add Reference e adicione a referencia a WindowsBase.dll. Se você não encontra-la na aba .NET, clique na aba Browse e procure no diretório C:Program FilesReference AssembliesMicrosoftFrameworkv3.0
Adicione no inicio da classe a referencia a classe abaixo:
Imports System.IO.Packaging
Escreva o código abaixo:
Dim zipPath As String = "C:TEMPmyzip.zip"
Dim fileToAdd As String = "C:TEMPCompressMe.txt"
'Abre o arquivo zip, se ele existe, senão cria um novo
Dim zip As Package = ZipPackage.Open(zipPath, _
IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
'Substitui os espaços por underscore (_)
Dim uriFileName As String = fileToAdd.Replace(" ", "_")
'A Uri sempre começa com 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
'O PackagePart contém as informações:
' Sempre extrair o arquivo quando ele é extraído (partUri)
' O tipo do conteúdo do fluxo (MIME type) - (contentType)
' O tipo de compressão usado (CompressionOption.Normal)
Dim pkgPart As PackagePart = _
zip.CreatePart(partUri, contentType, _
CompressionOption.Normal)
'Leia todos os bytes do arquivo para adiciona-lo ao arquivo zip
Dim bites As Byte() = File.ReadAllBytes(fileToAdd)
'Comprimir e escrever os byte no arquivo zip
pkgPart.GetStream().Write(bites, 0, bites.Length)
zip.Close() 'Fecha o arquivo zip
Podemos melhorar o código para aumentar a eficiência:
Private Sub ZipFiles()
Dim zipPath As String = "C:TEMPmyzip.zip"
'Abre o arquivo zip, se ele existe, senão cria um novo
Dim zip As Package = ZipPackage.Open(zipPath, _
IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
'Adicionar vários arquivos:
AddToArchive(zip, "C:TEMPCompressMe1.txt")
AddToArchive(zip, "C:TEMPCompressMe2.txt")
AddToArchive(zip, "C:TEMPCompressMe3.txt")
zip.Close() 'Fecha o arquivo zip
End Sub
Private Sub AddToArchive(ByVal zip As Package, _
ByVal fileToAdd As String)
'Substitui os espaços por underscore (_)
Dim uriFileName As String = fileToAdd.Replace(" ", "_")
'A Uri sempre começa com 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
'O PackagePart contém as informações:
' Sempre extrair o arquivo quando ele é extraído (partUri)
' O tipo do conteúdo do fluxo (MIME type) - (contentType)
' O tipo de compressão usado (CompressionOption.Normal)
Dim pkgPart As PackagePart = zip.CreatePart(partUri, _
contentType, CompressionOption.Normal)
'Leia todos os bytes do arquivo para adiciona-lo ao arquivo zip
Dim bites As Byte() = File.ReadAllBytes(fileToAdd)
'Comprimir e escrever os byte no arquivo zip
pkgPart.GetStream().Write(bites, 0, bites.Length)
End Sub
Pontos importantes
Algo que você vai notar, é que ao abrir o arquivo .zip em um utilitário zip, o arquivo “[Content_Types].xml”. Infelizmente, você não tem controle sobre a presença deste arquivo. É um arquivo que inclui informações sobre o tipo de conteúdo dos arquivos que estão incluídos no arquivo zip, como txt para arquivo texto, ou doc para um arquivo do Word, etc.
Além disso, se você definir qualquer uma das propriedades para o PackagePart (pkgPart.Package.PackageProperties), então você terá arquivos adicionais adicionados ao arquivo zip, com o nome de ####.psmdcp (onde #### é um número aleatório), que é um arquivo que contém metadados para as propriedades do Package e um arquivo .rels, que é um arquivo XML sobre o relacionamento dos metadados.
