Приветствую всех, иногда в логике своих приложений требуется архивация или как еще говорят компрессия данных. Сегодня рассмотрим несколько примеров того как этом можно реализовать с базовыми библиотеками.
Создаем GZip архив
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
static void Main() { // Создание файла и архива. FileStream source = File.OpenRead(@"D:\test.txt"); FileStream destination = File.Create(@"D:\archive.zip"); // Создание компрессора. GZipStream compressor = new GZipStream(destination, CompressionMode.Compress); // Заполнение архива информацией из файла. int theByte = source.ReadByte(); while (theByte != -1) { compressor.WriteByte((byte)theByte); theByte = source.ReadByte(); } // Удаление компрессора. compressor.Close(); } |
В примере выше почти все строки кода имеют комментарии и не вызовут у вас вопросов, но поверхносно пройтись по коду можно. Создаем два потока один открытия файла для архивации, другой поток создает сам фаил будущего архива. Далее передаем аргументы в класс GZipStream и производим заполнения архива.
Разархивируем GZIP архив
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main() { FileStream source = File.OpenRead(@"D:\archive.zip"); FileStream destination = File.Create(@"D:\text_zip.txt"); GZipStream deCompressor = new GZipStream(source, CompressionMode.Decompress); int theByte = deCompressor.ReadByte(); while (theByte != -1) { destination.WriteByte((byte)theByte); theByte = deCompressor.ReadByte(); } deCompressor.Close(); } |
По аналогии как и выше мы создали два потока, в одном открыли фаил, в другом создали текстовый фаил. Передали аргументы в конструктор класса и выполнили декомпрессию архива.
Архивация и разархивирования DeflateStream.
По аналогии примером выше, производим и с классом DeflateStream
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main() { FileStream source = File.OpenRead(@"D:\test.txt"); FileStream destination = File.Create(@"D:\archive.dfl"); DeflateStream compressor = new DeflateStream(destination, CompressionMode.Compress); int theByte = source.ReadByte(); while (theByte != -1) { compressor.WriteByte((byte)theByte); theByte = source.ReadByte(); } compressor.Close(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
static void Main() { FileStream source = File.OpenRead(@"D:\archive.dfl"); FileStream destination = File.Create(@"D:\text_deflate.txt"); DeflateStream deCompressor = new DeflateStream(source, CompressionMode.Decompress); int theByte = deCompressor.ReadByte(); while (theByte != -1) { destination.WriteByte((byte)theByte); theByte = deCompressor.ReadByte(); } deCompressor.Close(); } |
Не достатком такого архивирования данных будет то что это можно сделать лишь с одним файлом, а не с группой файлов или папкой. Для этого прийдется использовать другие классы, либо разрабатывать свой алгоритм на основе существующих.
Последним и популярным архивом является ZIP
Существует много способов архивации файлов. Но я использую именно его:
1 2 3 4 5 6 7 |
string startPath = @"c:\example\start"; string zipPath = @"c:\example\result.zip"; string extractPath = @"c:\example\extract"; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath); |
Для работы с этим классом требуется подключить:
1 |
using System.IO.Compression; |
И добавить ссылку к проекту:
1 |
System.IO.Compression |
Существуют библиотеки сторонние которые позволяют работать с группой файлов и папок, одна из них DotNetZip но рассматривать ее я не страл, слишьком много примеров в интернете, я ее редко использую.