Создать ZIP-архив на С#

Архивы ZIP используются для сжатия и хранения одного или нескольких файлов или папок в одном контейнере. ZIP-архив инкапсулирует файлы и папки, а также содержит информацию об их метаданных. Наиболее распространенное использование архивации — это уменьшение размера файлов для хранения или передачи и применение шифрования для обеспечения безопасности. Помимо инструментов сжатия файлов, функции автоматического сжатия/извлечения также используются в различных настольных и веб-приложениях для загрузки, скачивания, совместного использования или шифрования файлов. Эта статья также нацелена на аналогичные сценарии и представляет несколько простых способов сжатия файлов или папок и создания ZIP-архивов программными средствами с помощью C#.

В этой статье вы узнаете, как выполнять следующие операции ZIP-архивирования:

Предварительное условие — ZIP-библиотека C#

Aspose.ZIP for .NET — это мощный и простой в использовании API для сжатия или распаковки файлов и папок в приложениях .NET. Он также предоставляет методы шифрования AES для шифрования файлов в ZIP-архивах. Вы можете установить API из NuGet или загрузить его двоичные файлы из раздела Загрузки.

Создайте ZIP-архив на C#

Ниже приведены шаги по сжатию файла путем его добавления в ZIP-архив:

В следующем примере кода показано, как добавить файл в ZIP-архив с помощью C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compressed_file.zip", FileMode.Create))
{
	// Файл для добавления в архив
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		using (var archive = new Archive(new ArchiveEntrySettings()))
		{
			// Добавить файл в архив
			archive.CreateEntry("alice29.txt", source1);
			// ZIP-файл
			archive.Save(zipFile);
		}
	}
}

Добавить несколько файлов в ZIP-архив на С#

Если вы хотите добавить несколько файлов в ZIP-архив, вы можете сделать это одним из следующих способов.

Заархивируйте несколько файлов с помощью FileStream

В этом методе класс FileStream используется для добавления файлов в ZIP-архив с помощью метода Archive.CreateEntry(String, FileStream). В следующем примере кода показано, как добавить несколько файлов в ZIP-архив на C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Файл для добавления в архив
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		// Файл для добавления в архив
		using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		{
			using (var archive = new Archive())
			{
				// Добавить файлы в архив
				archive.CreateEntry("alice29.txt", source1);
				archive.CreateEntry("asyoulik3.txt", source2);
				// Заархивируйте файлы
				archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
			}
		}
	}
}

ZIP несколько файлов с использованием FileInfo

Вы также можете использовать класс FileInfo для добавления нескольких файлов в ZIP-архив. В этом методе файлы будут загружены с помощью класса FileInfo и добавлены в ZIP-архив с помощью метода Archive.CreateEntry(String, FileInfo). В следующем примере кода показано, как архивировать несколько файлов с помощью класса FileInfo в C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Файлы для добавления в архив
	FileInfo fi1 = new FileInfo("alice29.txt");
	FileInfo fi2 = new FileInfo("fields.c");

	using (var archive = new Archive())
	{
		// Добавить файлы в архив
		archive.CreateEntry("alice29.txt", fi1);
		archive.CreateEntry("fields.c", fi2);
		// Создать ZIP-архив
		archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	}
}

ZIP-файлы с использованием пути

Вместо использования классов FileInfo или FileStream для записей ZIP вы можете указать путь к файлу непосредственно методу Archive.CreateEntry(String name, String path, Boolean openImmediately, ArchiveEntrySettings newEntrySettings). В следующем примере кода показано, как сжать файлы ZIP, используя их путь.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
{
    // Создать архив
    using (var archive = new Archive())
    {
        // Добавить файл в ZIP-архив
        archive.CreateEntry("data.bin", "file.dat");
        archive.Save(zipFile);
    }
}

Добавить папки в ZIP-архив на C#

Вы также можете заархивировать папку, что может быть еще одной альтернативой добавлению нескольких файлов в ZIP-архив. Просто поместите исходные файлы в папку и добавьте эту папку в ZIP-архив. Ниже приведены шаги для ZIP папки:

  • Создайте объект класса FileStream для выходного ZIP-архива.
  • Создайте экземпляр класса Архив.
  • Используйте класс DirectoryInfo, чтобы указать папку для архивации.
  • Используйте метод Archive.CreateEntries(DirectoryInfo), чтобы добавить папку в ZIP.
  • Создайте ZIP-архив, используя метод Archive.Save(FileStream).

В следующем примере кода показано, как добавить папку в ZIP-архив на C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive())
	{
		// Папка для архивации
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Создать ZIP-архив
		archive.Save(zipFile);
	}
}

Создайте защищенный паролем ZIP-файл, используя ZipCrypto в C#

Вы можете защитить ZIP-архивы с помощью паролей и применить шифрование ZipCrypto. Для этого в конструкторе класса Archive используется класс ArchiveEntrySettings, который вторым параметром принимает тип шифрования.

В следующем примере кода показано, как создать ZIP-архив, защищенный паролем, с помощью ZipCrypto на C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$"))))
	{
		// Добавить папку в архив
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Создать ZIP-архив
		archive.Save(zipFile);
	}
}

С# Создать защищенный паролем ZIP с шифрованием AES

Aspose.ZIP для .NET также позволяет применять шифрование AES для защиты ZIP-архивов. Вы можете использовать следующие методы шифрования AES:

  • AES128
  • AES192
  • AES256

Для применения шифрования AES API предлагает класс AesEcryptionSettings. В следующем примере кода показано, как создать защищенный паролем ZIP-файл с шифрованием AES на C#.

// Создать FileStream для выходного ZIP-архива
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$", EncryptionMethod.AES128))))
	{
		// Добавить папку в архив
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Создать ZIP-архив
		archive.Save(zipFile);
	}
}

Установить режим параллельного сжатия

Вы также можете настроить API для параллельного сжатия в случае нескольких записей. Для этого можно указать режим параллельного сжатия с помощью класса ParallelOptions. Aspose.ZIP для .NET предоставляет следующие режимы параллельного сжатия.

  • Никогда — не сжимать параллельно.
  • Всегда — делать сжатие параллельно (остерегайтесь нехватки памяти).
  • Авто — решите, использовать ли параллельное сжатие для записей. Эта опция может сжимать только некоторые записи параллельно.

В следующем примере кода показано, как установить режим параллельного сжатия при сжатии нескольких файлов.

// Полные примеры и файлы данных можно найти на странице 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);
                //Определите критерий параллелизма
                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"
                    });
            }
        }
    }
}

Узнайте больше об Aspose.ZIP для .NET

Узнайте больше о нашем C# ZIP API, используя следующие ресурсы:

Вывод

В этой статье вы узнали, как программно создавать ZIP-архивы на C#. В примерах кода показано, как добавлять файлы и папки в ZIP-архивы. Кроме того, мы также рассмотрели, как создавать ZIP-архивы, защищенные паролем, с помощью методов шифрования ZipCrypto и AES на C#. Кроме того, в конце также обсуждается параллельное сжатие нескольких записей. Если у вас возникнут какие-либо вопросы или вопросы, вы можете задать их нам через наш форум.

Смотрите также