Работа с архивами формата 7z и zip с помощью библиотеки SevenZipSharp

Библиотека SevenZipSharp является оболочкой для работы с API архиватора 7zip в среде .NET. Она позволяет создавать как «обычные» так и зашифрованные архивы форматов 7z и zip, а также выполнять их распаковку.

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

Библиотека содержит два класса, назначение которых в принципе понятно из их названия.

  • SevenZipCompressor – архивирование;
  • SevenZipExtractor – распаковка архивов.

О классе SevenZipExtractor необходимо сказать особо.

К сожалению, как и любая другая оболочка, эта библиотека не может выполнять свои функции самостоятельно. Поэтому в самом начале требуется указать местоположение самого архиватора 7zip (библиотеки 7z.dll).

Делается это с помощью статического метода SetLibraryPath класса SevenZipExtractor. Например:

SevenZipExtractor.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");

После того как путь к библиотеке 7z.dll указан, можно приступать непосредственно к работе с архивами.

Создание архива

В начале указываем полный путь к архивируемому файлу или создаём массив из полных путей к файлам, если планируется упаковать в архив сразу несколько.

string[] arr = { @"C:\1.txt", @"C:\2.txt" };

Далее создаём объект класса SevenZipCompressor и указываем формат архива (SevenZip или Zip).

SevenZipCompressor szc = new SevenZipCompressor();
szc.ArchiveFormat = OutArchiveFormat.SevenZip;

Далее указываем режим архивации.

  • Create – создаётся новый файл архива. Существующий файл с таким же именем будет перезаписан;
  • Append – добавление новых файлов в уже существующий архив.

После этого выполняем непосредственно саму архивацию с помощью метода CompressFiles.

szc.CompressFiles("test.7z", arr);

 

  • Первый параметр – путь к файлу архива;
  • Второй параметр путь к архивируемому файлу или массив из путей.

Ниже показан пример создания архива, который содержит два текстовых файла:

string[] arr = { @"C:\1.txt", @"C:\2.txt" };
SevenZipExtractor.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");
SevenZipCompressor szc = new SevenZipCompressor();
szc.ArchiveFormat = OutArchiveFormat.SevenZip;
szc.CompressionMode = CompressionMode.Create;
szc.CompressFiles("test2.7z", arr);

Особенности создания зашифрованных архивов

Если требуется создать архив зашифрованный паролем, сначала указываем алгоритм шифрования.

szc.ZipEncryptionMethod = ZipEncryptionMethod.Aes256;

Помимо Aes256 также доступны алгоритмы: Zip, Aes128 и Aes192.

Далее при необходимости зашифровать имена файлов в архиве присваиваем свойству EncryptHeaders значение true.

szc.EncryptHeaders = true;

Данное свойство имеет значение по умолчанию false. Поэтому, если шифровать имена файлов не требуется, значение этому свойству в коде можно принудительно не присваивать.

Вследствие имеющихся недоработок шифрование имён файлов происходи только для архивов формата 7z, только при создании архива и только при передаче имён архивируемых файлов в виде массива.Возможно, впоследствии разработчики исправят эту ошибку.

Сама же архивация выполняется с помощью метода CompressFilesEncrypted.

szc.CompressFilesEncrypted("test.7z", "123", arr);

  • Первый параметр – путь к файлу архива;
  • Второй параметр – пароль к архиву;
  • Третий параметр – путь к архивируемому файлу или массив из путей.
Распаковка архива

Распаковка архива производится значительно проще, чем его создание.

Для этого необходимо создать объект класса SevenZipExtractor с указанием полного пути к файлу архива и вызвать метод ExtractArchive с указанием полного пути к папке, в которую будет распаковано его содержимое. В случае передачи пустой строки, содержимое архива распаковывается в корневой каталог жёсткого диска.

SevenZipExtractor sze = new SevenZipExtractor(@"C:\Test.7z");
sze.ExtractArchive("");

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

  • Первый параметр метода ExtractFiles, это папка для извлечения файлов. При передачи пустой строки файлы распаковываются в корневой каталог жёсткого диска;
  • Второй параметр – массив с именами извлекаемых файлов.

Однако извлечь из архива отдельный файл, например, зная его имя так просто уже не получится. Требуется задействовать файловый поток.

SevenZipExtractor sze = new SevenZipExtractor(@"C:\Test.7z");
FileStream fs = new FileStream(@"C:\2.txt",FileMode.Create);
sze.ExtractFile("150.txt", fs);
fs.Close();
fs.Dispose();

Особенности распаковки зашифрованных архивов

Как уже отмечалось выше, распаковать архив, гораздо проще, чем его создать.

Для распаковки зашифрованного архива, при создании объекта класса SevenZipExtractor, помимо полного пути к файлу архива, дополнительно указывается пароль к нему.


Несмотря на то, что библиотека SevenZipSharp это всего лишь оболочка, и она пока ещё имеет ряд недоработок, в целом она представляет собой удобное и эффективное средство для решения задач связанных с обработкой архивов формата 7z или zip в .NET.

Ссылки

Официальная страница SevenZipSharp на CodePlex

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

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