Библиотека 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("");
Не намного сложнее выполняется извлечение из архива нескольких файлов. Если известны их имена, то извлечь эти файлы из архива в нужную папку можно следующим способом.
sze.ExtractFiles("",new string[]{ "1.txt","2.txt"});
- Первый параметр метода 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, помимо полного пути к файлу архива, дополнительно указывается пароль к нему.
SevenZipExtractor sze = new SevenZipExtractor(@"C:\Test.7z","123");
В остальном распаковка зашифрованного архива ничем не отличается от распаковки обычного.
Несмотря на то, что библиотека SevenZipSharp это всего лишь оболочка, и она пока ещё имеет ряд недоработок, в целом она представляет собой удобное и эффективное средство для решения задач связанных с обработкой архивов формата 7z или zip в .NET.
Ссылки
Официальная страница SevenZipSharp на CodePlex