Criar ZIP em C#

Os arquivos ZIP são usados para compactar e manter um ou mais arquivos ou pastas em um único contêiner. Um arquivo ZIP encapsula os arquivos e pastas, bem como mantém suas informações de metadados. O uso mais comum do arquivamento é reduzir o tamanho dos arquivos para armazenamento ou transmissão e aplicar criptografia para segurança. Além das ferramentas de compactação de arquivos, os recursos automatizados de compactação/extração também são usados em vários aplicativos de desktop e web para upload, download, compartilhamento ou criptografia dos arquivos. Este artigo também visa cenários semelhantes e apresenta algumas maneiras fáceis de compactar arquivos ou pastas e criar arquivos ZIP programaticamente usando C#.

Neste artigo, você aprenderá como realizar as seguintes operações de arquivamento ZIP:

Biblioteca C# ZIP

Aspose.ZIP for .NET é uma API poderosa e fácil de usar para compactar ou descompactar arquivos e pastas dentro de aplicativos .NET. Ele também fornece técnicas de criptografia AES para criptografar os arquivos em ZIP em C#. Você pode instalar a API de NuGet ou baixar seus binários da seção Downloads.

Criar um arquivo ZIP em C#

A seguir estão as etapas para compactar um arquivo adicionando-o a um arquivo ZIP:

O exemplo de código a seguir mostra como adicionar um arquivo a um arquivo ZIP usando C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compressed_file.zip", FileMode.Create))
{
	// Arquivo a ser adicionado ao arquivo
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		using (var archive = new Archive(new ArchiveEntrySettings()))
		{
			// Adicionar arquivo ao arquivo
			archive.CreateEntry("alice29.txt", source1);
			// arquivo ZIP
			archive.Save(zipFile);
		}
	}
}

Adicionar vários arquivos ao arquivo ZIP em C#

Caso você queira adicionar vários arquivos em um arquivo ZIP, você pode fazê-lo usando uma das seguintes maneiras.

C# ZIP vários arquivos usando FileStream

Nesse método, a classe FileStream é usada para adicionar arquivos ao arquivo ZIP usando o método Archive.CreateEntry(String, FileStream). O exemplo de código a seguir mostra como adicionar vários arquivos em um ZIP em C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Arquivo a ser adicionado ao arquivo
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		// Arquivo a ser adicionado ao arquivo
		using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		{
			using (var archive = new Archive())
			{
				// Adicionar arquivos ao arquivo
				archive.CreateEntry("alice29.txt", source1);
				archive.CreateEntry("asyoulik3.txt", source2);
				// ZIP os arquivos
				archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
			}
		}
	}
}

C# ZIP vários arquivos usando FileInfo

Você também pode usar a classe FileInfo para adicionar vários arquivos em um arquivo ZIP. Neste método, os arquivos serão carregados usando a classe FileInfo e adicionados ao arquivo ZIP usando o método Archive.CreateEntry(String, FileInfo). O exemplo de código a seguir mostra como ZIP vários arquivos usando a classe FileInfo em C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Arquivos a serem adicionados ao arquivo
	FileInfo fi1 = new FileInfo("alice29.txt");
	FileInfo fi2 = new FileInfo("fields.c");

	using (var archive = new Archive())
	{
		// Adicionar arquivos ao arquivo
		archive.CreateEntry("alice29.txt", fi1);
		archive.CreateEntry("fields.c", fi2);
		// Criar arquivo ZIP
		archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	}
}

Arquivos ZIP usando o caminho

Em vez de usar as classes FileInfo ou FileStream para as entradas ZIP, você pode fornecer o caminho do arquivo diretamente para o método Archive.CreateEntry(String name, String path, Boolean openImmediately, ArchiveEntrySettings newEntrySettings). O exemplo de código a seguir mostra como ZIP arquivos usando seu caminho.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
{
    // Criar arquivo
    using (var archive = new Archive())
    {
        // Adicionar arquivo ao arquivo ZIP
        archive.CreateEntry("data.bin", "file.dat");
        archive.Save(zipFile);
    }
}

Adicionar pastas a um arquivo ZIP em C#

Você pode ZIP uma pasta com a biblioteca C# ZIP, que pode ser outra alternativa de adicionar vários arquivos a um arquivo ZIP. Basta colocar os arquivos de origem em uma pasta e adicionar essa pasta ao arquivo ZIP. A seguir estão as etapas para ZIP uma pasta em C#:

O exemplo de código a seguir mostra como adicionar uma pasta ao ZIP em C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive())
	{
		// Pasta a ser compactada
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Criar arquivo ZIP
		archive.Save(zipFile);
	}
}

Crie um ZIP protegido por senha usando ZipCrypto em C#

Você pode proteger os arquivos ZIP usando senhas e aplicar a criptografia ZipCrypto. Para isso, é utilizada a classe ArchiveEntrySettings no construtor do Archive que aceita o tipo de criptografia como segundo parâmetro.

O exemplo de código a seguir mostra como criar um arquivo ZIP protegido por senha usando ZipCrypto em C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$"))))
	{
		// Adicionar pasta ao arquivo
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Criar arquivo ZIP
		archive.Save(zipFile);
	}
}

C# Criar ZIP Protegido por Senha com Criptografia AES

O Aspose.ZIP para .NET também permite aplicar criptografia AES para proteger os arquivos ZIP. Você pode usar os seguintes métodos de criptografia AES:

  • AES128
  • AES192
  • AES256

Para aplicar a criptografia AES, a API oferece a classe AesEcryptionSettings. O exemplo de código a seguir mostra como criar um ZIP protegido por senha com criptografia AES em C#.

// Criar FileStream para arquivo ZIP de saída
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$", EncryptionMethod.AES128))))
	{
		// Adicionar pasta ao arquivo
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Criar arquivo ZIP
		archive.Save(zipFile);
	}
}

Definir modo de compactação paralelo

Você também pode configurar a API para compactação paralela no caso de várias entradas. Para isso, você pode especificar o modo de compactação paralela usando a classe ParallelOptions. O Aspose.ZIP para .NET fornece os seguintes modos de compactação paralelos.

  • Nunca - Não comprima em paralelo.
  • Sempre - Faça a compactação em paralelo (cuidado com a memória).
  • Automático - Decida se deseja usar compactação paralela ou não nas entradas. Esta opção pode comprimir algumas entradas apenas em paralelo.

O exemplo de código a seguir mostra como definir o modo de compactação paralelo ao compactar vários arquivos com a biblioteca C# ZIP do Aspose.

// Para exemplos completos e arquivos de dados, acesse https://github.com/aspose-zip/Aspose.ZIP-for-.NET
using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
{
    using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
    {
        using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive())
            {
                archive.CreateEntry("alice29.txt", source1);
                archive.CreateEntry("asyoulik.txt", source2);
                //Defina o critério de paralelismo
                var parallelOptions = new ParallelOptions
                {
                    ParallelCompressInMemory = ParallelCompressionMode.Always
                };
                archive.Save(zipFile,
                    new ArchiveSaveOptions()
                    {
                        ParallelOptions = parallelOptions,
                        Encoding = Encoding.ASCII,
                        ArchiveComment = "There are two poems from Canterbury corpus"
                    });
            }
        }
    }
}

Saiba mais sobre a biblioteca C# .NET ZIP

Explore mais sobre nossa API C# ZIP usando os seguintes recursos:

Conclusão

Neste artigo, você aprendeu como criar arquivos ZIP programaticamente em C#. Os exemplos de código demonstraram como adicionar arquivos e pastas nos arquivos ZIP. Além disso, também abordamos como criar arquivos ZIP protegidos por senha com métodos de criptografia ZipCrypto e AES usando a biblioteca ZIP do C# Aspose. Além disso, a compactação paralela de várias entradas também é discutida no final. Caso você tenha alguma dúvida ou pergunta, você pode nos perguntar através do nosso fórum.

Veja também