ZipArchive Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa um pacote de arquivos compactados no formato de arquivo zip.
public ref class ZipArchive : IDisposable
public class ZipArchive : IDisposable
type ZipArchive = class
interface IDisposable
Public Class ZipArchive
Implements IDisposable
- Herança
-
ZipArchive
- Implementações
Comentários
Os métodos para manipular arquivos zip e suas entradas de arquivo são distribuídos em três classes: ZipFile, ZipArchivee ZipArchiveEntry.
Para | Uso |
---|---|
Create um arquivo zip de um diretório | ZipFile.CreateFromDirectory |
Extrair o conteúdo de um arquivo zip para um diretório | ZipFile.ExtractToDirectory |
Adicionar novos arquivos a um arquivo zip existente | ZipArchive.CreateEntry |
Recuperar um arquivo de um arquivo zip | ZipArchive.GetEntry |
Recuperar todos os arquivos de um arquivo zip | ZipArchive.Entries |
Abrir um fluxo para um único arquivo contido em um arquivo zip | ZipArchiveEntry.Open |
Excluir um arquivo de um arquivo zip | ZipArchiveEntry.Delete |
Quando você cria uma nova entrada, o arquivo é compactado e adicionado ao pacote zip. O CreateEntry método permite que você especifique uma hierarquia de diretório ao adicionar a entrada. Você inclui o caminho relativo da nova entrada dentro do pacote zip. Por exemplo, criar uma nova entrada com um caminho relativo de cria um arquivo de AddedFolder\NewFile.txt
texto compactado em um diretório chamado AddedFolder.
Se você fizer referência ao System.IO.Compression.FileSystem
assembly em seu projeto, poderá acessar quatro métodos de extensão (da ZipFileExtensions classe) para a ZipArchive classe : CreateEntryFromFile(ZipArchive, String, String), CreateEntryFromFile(ZipArchive, String, String, CompressionLevel), ExtractToDirectory(ZipArchive, String)e ExtractToDirectory(ZipArchive, String, Boolean) (disponíveis no .NET Core 2.0 e versões posteriores). Esses métodos de extensão permitem compactar e descompactar o conteúdo da entrada em um arquivo. O System.IO.Compression.FileSystem
assembly não está disponível para aplicativos da Store Windows 8.x. Em aplicativos Windows 8.x Store, você pode compactar e descompactar arquivos usando a DeflateStream classe ou GZipStream ou pode usar os tipos Compressor de Windows Runtime e Decompressor.
Exemplos
O primeiro exemplo mostra como criar uma nova entrada e gravar nela usando um fluxo.
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
writer.WriteLine("Information about this package.");
writer.WriteLine("========================");
}
}
}
}
}
}
Imports System.IO
Imports System.IO.Compression
Module Module1
Sub Main()
Using zipToOpen As FileStream = New FileStream("c:\users\exampleuser\release.zip", FileMode.Open)
Using archive As ZipArchive = New ZipArchive(zipToOpen, ZipArchiveMode.Update)
Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("Readme.txt")
Using writer As StreamWriter = New StreamWriter(readmeEntry.Open())
writer.WriteLine("Information about this package.")
writer.WriteLine("========================")
End Using
End Using
End Using
End Sub
End Module
O exemplo a seguir mostra como abrir um arquivo zip e iterar por meio da coleção de entradas.
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main(string[] args)
{
string zipPath = @".\result.zip";
Console.WriteLine("Provide path where to extract the zip file:");
string extractPath = Console.ReadLine();
// Normalizes the path.
extractPath = Path.GetFullPath(extractPath);
// Ensures that the last character on the extraction path
// is the directory separator char.
// Without this, a malicious zip file could try to traverse outside of the expected
// extraction path.
if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
extractPath += Path.DirectorySeparatorChar;
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
{
// Gets the full path to ensure that relative segments are removed.
string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
// Ordinal match is safest, case-sensitive volumes can be mounted within volumes that
// are case-insensitive.
if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
entry.ExtractToFile(destinationPath);
}
}
}
}
}
Imports System.IO
Imports System.IO.Compression
Module Module1
Sub Main()
Dim zipPath As String = ".\result.zip"
Console.WriteLine("Provide path where to extract the zip file:")
Dim extractPath As String = Console.ReadLine()
' Normalizes the path.
extractPath = Path.GetFullPath(extractPath)
' Ensures that the last character on the extraction path
' is the directory separator char.
' Without this, a malicious zip file could try to traverse outside of the expected
' extraction path.
If Not extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal) Then
extractPath += Path.DirectorySeparatorChar
End If
Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
For Each entry As ZipArchiveEntry In archive.Entries
If entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) Then
' Gets the full path to ensure that relative segments are removed.
Dim destinationPath As String = Path.GetFullPath(Path.Combine(extractPath, entry.FullName))
' Ordinal match is safest, case-sensitive volumes can be mounted within volumes that
' are case-insensitive.
If destinationPath.StartsWith(extractPath, StringComparison.Ordinal) Then
entry.ExtractToFile(destinationPath)
End If
End If
Next
End Using
End Sub
End Module
O terceiro exemplo mostra como usar métodos de extensão para criar uma nova entrada em um arquivo zip de um arquivo existente e extrair o conteúdo do arquivo morto. Você deve referenciar o System.IO.Compression.FileSystem
assembly para executar o código.
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string zipPath = @"c:\users\exampleuser\start.zip";
string extractPath = @"c:\users\exampleuser\extract";
string newFile = @"c:\users\exampleuser\NewFile.txt";
using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
{
archive.CreateEntryFromFile(newFile, "NewEntry.txt");
archive.ExtractToDirectory(extractPath);
}
}
}
}
Imports System.IO
Imports System.IO.Compression
Module Module1
Sub Main()
Dim zipPath As String = "c:\users\exampleuser\end.zip"
Dim extractPath As String = "c:\users\exampleuser\extract"
Dim newFile As String = "c:\users\exampleuser\NewFile.txt"
Using archive As ZipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update)
archive.CreateEntryFromFile(newFile, "NewEntry.txt", CompressionLevel.Fastest)
archive.ExtractToDirectory(extractPath)
End Using
End Sub
End Module
Construtores
ZipArchive(Stream) |
Inicializa uma nova instância da classe ZipArchive do fluxo especificado. |
ZipArchive(Stream, ZipArchiveMode) |
Inicializa uma nova instância da classe ZipArchive no fluxo especificado e com o modo especificado. |
ZipArchive(Stream, ZipArchiveMode, Boolean) |
Inicializa uma nova instância da classe ZipArchive no fluxo especificado para o modo especificado e, opcionalmente, deixa o fluxo aberto. |
ZipArchive(Stream, ZipArchiveMode, Boolean, Encoding) |
Inicializa uma nova instância da classe ZipArchive no fluxo especificado para o modo especificado, usa a codificação especificada para nomes de entrada e, como opção, deixa o fluxo aberto. |
Propriedades
Comment |
Obtém ou define o comentário de arquivo morto opcional. |
Entries |
Obtém a coleção de entradas que atualmente estão no arquivo zip. |
Mode |
Obtém um valor que descreve o tipo de ação que o arquivo zip pode executar em entradas. |
Métodos
CreateEntry(String) |
Cria uma entrada vazia que tem o caminho especificado e nome de entrada no arquivo zip. |
CreateEntry(String, CompressionLevel) |
Cria uma entrada vazia que tem o nível de compactação e o nome de entrada especificados no arquivo-morto zip. |
Dispose() |
Libera os recursos usados pela instância atual da classe ZipArchive. |
Dispose(Boolean) |
Chamado pelos métodos Dispose() e Finalize() para liberar os recursos não gerenciados usados pela instância atual da classe ZipArchive e, opcionalmente, terminar de gravar o arquivo e libera os recursos gerenciados. |
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetEntry(String) |
Recupera um wrapper para a entrada especificada no arquivo zip. |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Métodos de Extensão
CreateEntryFromFile(ZipArchive, String, String) |
Arquiva um arquivo compactando-o e adicionando-o ao arquivo zip. |
CreateEntryFromFile(ZipArchive, String, String, CompressionLevel) |
Arquiva um arquivo, compactando-o usando o nível de compactação especificado e adicionando-o ao arquivo zip. |
ExtractToDirectory(ZipArchive, String) |
Extrai todos os arquivos no arquivo zip especificado para um diretório do sistema de arquivos. |
ExtractToDirectory(ZipArchive, String, Boolean) |
Extrai todos os arquivos dos arquivos para um diretório do sistema de arquivos. |