Заархивируйте или разархивируйте файлы в .NET.
Обзор
В этой статье вы узнаете, как программно сжимать Zip-файлы с помощью различных методов с использованием C# или .NET API и примера кода. Вы узнаете, как архивировать или сжимать один или несколько файлов, а также как архивировать файлы одновременно. Вы также узнаете, как распаковывать или разархивировать файлы.
Архивируйте или сжимайте файлы в C# и распаковывайте или разархивируйте файлы в C#.
API Aspose.ZIP позволяет сжимать и распаковывать файлы, не беспокоясь о базовой файловой структуре. В этой статье показана работа со сжатием одного и нескольких файлов.
Сжатие файлов
Сжатие одного файла
Шаги: Сжатие одного файла в C#
- Создайте поток файлов с нужным именем выходного zip-файла.
- Создайте файловый поток файла данных, который необходимо сжать.
- Создайте экземпляр класса Archive и передайте ему экземпляр класса ArchiveEntrySettings.
- Добавьте файл данных, созданный на шаге 2, используя метод Archive.CreateEntry.
- Заархивируйте файл данных с помощью метода Archive.Save и передайте ему поток файлов, созданный на шаге 1.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
3 {
4 //File to be added to archive
5 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
6 {
7 using (var archive = new Archive(new ArchiveEntrySettings()))
8 {
9 archive.CreateEntry("alice29.txt", source1);
10
11 archive.Save(zipFile);
12 }
13 }
14 }
Сжатие нескольких файлов
Шаги: Сжатие нескольких файлов в C#
- Создайте поток файлов с нужным именем выходного zip-файла.
- Создайте файловый поток для первого файла данных, который необходимо сжать.
- Создайте файловый поток второго файла данных, который необходимо сжать.
- Создайте экземпляр класса Архив.
- Добавьте файлы данных, созданные на шагах 2 и 3, используя метод Archive.CreateEntry.
- Создайте экземпляр класса ArchiveSaveOptions.
- Заархивируйте файлы данных с помощью метода Archive.Save и передайте ему поток файлов, созданный на шаге 1, и экземпляр ArchiveSaveOptions, созданный на предыдущем шаге.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "There are two poems from Canterbury corpus" });
13 }
14 }
15 }
16 }
17
Сжатие файлов по информации о файле
Шаги: Сжатие файлов по информации о файле на C#
- Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла.
- Создайте объект FileInfo вашего первого файла данных, который нужно сжать.
- Создайте объект FileInfo второго файла данных, который необходимо сжать.
- Создайте экземпляр класса Архив.
- Добавьте файлы данных, созданные на шагах 2 и 3, используя метод Archive.CreateEntry.
- Создайте экземпляр класса ArchiveSaveOptions.
- Заархивируйте файлы данных с помощью метода Archive.Save и передайте ему поток файлов, созданный на шаге 1, и экземпляр ArchiveSaveOptions, созданный на предыдущем шаге.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressFilesByFileInfo_out.zip", FileMode.Create))
3 {
4 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
5 FileInfo fi2 = new FileInfo(dataDir + "fields.c");
6
7 using (var archive = new Archive())
8 {
9 archive.CreateEntry("alice29.txt", fi1);
10 archive.CreateEntry("fields.c", fi2);
11 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
12 }
13 }
14
Хранение файлов в архивах без сжатия
Шаги: Хранение Файлы в архивы без сжатия с использованием C#1. Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла. 2. Создайте объекты FileInfo для файлов данных, которые будут храниться в архиве. 3. Создайте экземпляр класса ArchiveEntrySettings и передайте ему экземпляр класса StoreCompressionSettings. 4. Создайте экземпляр класса Archive и передайте ему экземпляр класса ArchiveEntrySettings, созданный на предыдущем шаге. 5. Добавьте объекты FileInfo, созданные на шаге 2, с помощью метода Archive.CreateEntry. 6. Создайте экземпляр ArchiveSaveOptions и установите Кодировка = Encoding.ASCII. 7. Заархивируйте файлы данных с помощью метода Archive.Save и передайте ему поток файлов, созданный на шаге 1, и экземпляр ArchiveSaveOptions, созданный на предыдущем шаге.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 //Creates zip archive without compressing files
3 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
4 {
5 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
6 FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
7
8 using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
9 {
10 archive.CreateEntry("alice29.txt", fi1);
11 archive.CreateEntry("lcet10.txt", fi2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
13 }
14
15 }
16
Использование параллелизма для сжатия файлов
Шаги: Использование параллелизма для сжатия файлов с использованием C#
- Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла.
- Откройте потоки файлов с помощью FileMode.Open и FileAccess.Read для сжатия первого и второго файлов данных.
- Создайте экземпляр класса Архив.
- Добавьте файлы данных, созданные на шаге 2, используя метод Archive.CreateEntry.
- Создайте экземпляр ParallelOptions и установите ParallelCompressInMemory = ParallelCompressionMode.Always.
- Создайте экземпляр ArchiveSaveOptions и установите для его свойства ParallelOptions указанный выше экземпляр.
- Заархивируйте файлы данных с помощью метода Archive.Save и передайте ему поток файлов, созданный на шаге 1, и экземпляр ArchiveSaveOptions, созданный на предыдущем шаге.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 //Define the parallelism criterion
13 var parallelOptions = new ParallelOptions
14 {
15 ParallelCompressInMemory = ParallelCompressionMode.Always
16 };
17 archive.Save(zipFile,
18 new ArchiveSaveOptions()
19 {
20 ParallelOptions = parallelOptions,
21 Encoding = Encoding.ASCII,
22 ArchiveComment = "There are two poems from Canterbury corpus"
23 });
24 }
25 }
26 }
27 }
28
Сжатие LZMA в ZIP-архиве
Алгоритм цепочки Лемпеля-Зива-Маркова (LZMA) – это алгоритм, используемый для сжатия данных без потерь. LZMA использует алгоритм словарного сжатия, сжатый поток представляет собой поток битов. Сжатие LZMA в ZIP-архиве позволяет ZIP-контейнерам содержать записи, сжатые LZMA. В следующем примере кода показана реализация сжатия LZMA с использованием API Aspose.ZIP.
Шаги: LZMA-сжатие в ZIP-архиве с использованием C#
- Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла.
- Создайте экземпляр ArchiveEntrySettings и передайте ему экземпляр класса LzmaCompressionSettings.
- Создайте экземпляр класса Archive и передайте ему экземпляр ArchiveEntrySettings, созданный выше.
- Добавьте файлы данных для сжатия по путям к файлам, используя метод Archive.CreateEntry.
- Заархивируйте файлы данных методом Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
Сжатие BZip2 в ZIP-архиве
Настройки сжатия BZip2 позволяют ZIP-контейнеру содержать записи, сжатые BZip2. В следующем примере кода показана реализация сжатия BZip2 с использованием API Aspose.ZIP.
Шаги: Сжатие BZip2 в ZIP-архиве с использованием C#
- Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла.
- Создайте экземпляр ArchiveEntrySettings и передайте ему экземпляр класса Bzip2CompressionSettings.
- Создайте экземпляр класса Archive и передайте ему экземпляр ArchiveEntrySettings, созданный выше.
- Добавьте файлы данных для сжатия по путям к файлам, используя метод Archive.CreateEntry.
- Заархивируйте файлы данных методом Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
Сжатие PPMd в ZIP-архиве
Настройки сжатия PPMd позволяют ZIP-контейнеру содержать сжатые записи PPMd. В следующем примере кода продемонстрирована реализация сжатия PPMd с использованием API Aspose.ZIP.
Шаги: Сжатие PPMd в ZIP-архиве с использованием C#
- Откройте поток файлов с помощью FileMode.Create с нужным именем выходного zip-файла.
- Создайте экземпляр ArchiveEntrySettings и передайте ему экземпляр класса PPMdCompressionSettings.
- Создайте экземпляр класса Archive и передайте ему экземпляр ArchiveEntrySettings, созданный выше.
- Добавьте файлы данных для сжатия по путям к файлам, используя метод Archive.CreateEntry.
- Заархивируйте файлы данных методом Archive.Save.
1 using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
Распаковка архивов
Распаковка архива, состоящего из одного файла
Шаги: Распакуйте один файл из архива с помощью C# </а>
- Откройте поток файлов для входного ZIP-файла с помощью FileMode.OpenRead.
- Создайте экземпляр класса Archive, передав файловый поток конструктору.
- Отслеживайте ход распаковки с помощью события ExtractionProgressed записи архива.
- Извлеките один файл из архива с помощью метода Extract, указав путь к выходному файлу.
- Отображение прогресса декомпрессии в процентах в консоли.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
3 {
4 using (Archive archive = new Archive(fs))
5 {
6 int percentReady = 0;
7 archive.Entries[0].ExtractionProgressed += (s, e) =>
8 {
9 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
10 if (percent > percentReady)
11 {
12 Console.WriteLine(string.Format("{0}% decompressed", percent));
13 percentReady = percent;
14 }
15 };
16 archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
17 }
18 }
19
Распаковать архив, содержащий несколько файлов
Шаги: Распакуйте несколько файлов из архива с помощью C#< /strong></а>
- Откройте поток файлов для входного ZIP-файла с помощью FileMode.Open.
- Создайте экземпляр класса Archive с настраиваемыми параметрами загрузки для вывода списка записей и отслеживания хода распаковки.
- Отобразите имена всех записей архива с помощью события EntryListed.
- Отслеживайте ход распаковки с помощью события EntryExtractionProgressed, отображая прогресс в консоли.
- Извлеките несколько файлов из архива, используя метод Extract и считывая данные в выходные файлы.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
3 {
4 StringBuilder sb = new StringBuilder("Entries are: ");
5 int percentReady = 0;
6 using (Archive archive = new Archive(zipFile,
7 new ArchiveLoadOptions()
8 {
9 EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
10 EntryExtractionProgressed = (s, e) =>
11 {
12 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
13 if (percent > percentReady)
14 {
15 Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
16 }
17 }
18 }))
19 {
20 Console.WriteLine(sb.ToString(0, sb.Length - 2));
21 using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
22 {
23 using (var decompressed = archive.Entries[0].Open())
24 {
25 byte[] buffer = new byte[8192];
26 int bytesRead;
27 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
28 {
29 extracted.Write(buffer, 0, bytesRead);
30 }
31 // Read from decompressed stream to extracting file.
32 }
33 }
34 percentReady = 0;
35 archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
36 }
37 }
38
Извлечение сохраненного архива без сжатия
Шаги: Извлеките файлы из архива и сохраните на диск с использованием C#
- Откройте ZIP-файл и создайте экземпляр класса Archive.
- Извлеките первый файл из архива, открыв поток записи и записав его содержимое в новый файл.
- Используйте буфер для чтения данных из распакованного потока и сохранения их в выходной файл.
- Повторите процедуру для второго файла в архиве, записав его содержимое в отдельный выходной файл.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
3 {
4 using (Archive archive = new Archive(zipFile))
5 {
6 using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
7 {
8 using (var decompressed = archive.Entries[0].Open())
9 {
10 byte[] buffer = new byte[8192];
11 int bytesRead;
12 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
13 {
14 extracted.Write(buffer, 0, bytesRead);
15 }
16 // Read from decompressed stream to extracting file.
17 }
18 }
19
20 using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
21 {
22 using (var decompressed = archive.Entries[1].Open())
23 {
24 byte[] buffer = new byte[8192];
25 int bytesRead;
26 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
27 {
28 extracted.Write(buffer, 0, bytesRead);
29 }
30 // Read from decompressed stream to extracting file.
31 }
32 }
33 }
34 }
35