Приветствую всех, иногда в логике своих приложений требуется архивация или как еще говорят компрессия данных. Сегодня рассмотрим несколько примеров того как этом можно реализовать с базовыми библиотеками.
Создаем GZip архив
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 архив
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
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();
}
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
Существует много способов архивации файлов. Но я использую именно его:
string startPath = @"c:\example\start"; string zipPath = @"c:\example\result.zip"; string extractPath = @"c:\example\extract"; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath);
Для работы с этим классом требуется подключить:
using System.IO.Compression;
И добавить ссылку к проекту:
System.IO.Compression
Существуют библиотеки сторонние которые позволяют работать с группой файлов и папок, одна из них DotNetZip но рассматривать ее я не страл, слишьком много примеров в интернете, я ее редко использую.
