Архивы GZip, Deflate, ZIP

Приветствую всех, иногда в логике своих приложений требуется архивация или как еще говорят компрессия данных. Сегодня рассмотрим несколько примеров того как этом можно реализовать с базовыми библиотеками.

Создаем 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 но рассматривать ее я не страл, слишьком много примеров в интернете, я ее редко использую.

 

 

Обновлено: 31.05.2018 — 09:47

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.