CoderNotes - заметки программиста

Публикации  »  C#, C++
Скидка 65% на Skillbox

Получите скидку 65% на любой курс программирования на популярной образовательной платформе Skillbox!

Подробнее
Бесплатный хостинг + SSL-сертификат

Зарегистрируйте домен и получите 2 месяца бесплатного хостинга и SSL-сертификат на 1 год в подарок

Подробнее

Работа с zip-архивами в .NET Framework 3.5 на C#

Поддержка zip-архивирования появилась в .NET начиная с версии 4.5. В этой заметке я рассмотрю как работать с zip архивами в предыдущих версиях .NET, в частности в 3.5 и покажу примеры как упаковать файлы или папку в zip архив и как распаковать zip архив.

Итак, поскольку в .Net 3.5 нет встроенных функций, придется использовать внешнюю библиотеку. Наилучшим выбором, на мой взгляд, является DotNetZip. Эта библиотека проста в использовании, очень быстрая и при этом имеет гораздо больше методов для работы с архивами, чем даже стандартный ZipFile в .Net 4.5.

По приведенной выше ссылке можно скачать архив со всеми релизами этой библиотеки, либо, можете скачать последний релиз v1.9 на момент написания этой статьи. Подключение библиотеки к проекту - стандартное, через добавление ссылки. Теперь покажу несколько основных примеров как работать с этой библиотекой в .Net 3.5 на C#.

Создание zip архива и добавление в него файлов

using (ZipFile zip = new ZipFile())
{
  zip.AddFile("ReadMe.txt");
  zip.AddFile("ReadMe.doc");
  zip.Save("arhive.zip");
}

Добавить файл в zip архив без полного пути (иерархии) к нему

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

using (ZipFile zip = new ZipFile())
{
  zip.AddFile("ReadMe.txt", "");
  zip.Save("arhive.zip");
}

Создание зашифрованного (запароленного) zip-архива

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

using (ZipFile zip = new ZipFile())
{
  zip.AddFile("ReadMe1.txt"); // не будет зашифрован
  zip.Password= "123";
  zip.AddFile("ReadMe2.txt"); // будет зашифрован с паролем 123
  zip.AddFile("ReadMe3.txt"); // будет зашифрован с паролем 123
  zip.Password= "456";
  zip.AddFile("ReadMe4.txt"); // будет зашифрован с паролем 456
  zip.Save("arhive.zip");
}

Упаковка всей папки с файлами (директории) рекурсивно

using (ZipFile zip = new ZipFile())
{
  zip.AddDirectory(@"C:\Work\MyFolder");
  zip.Save("arhive.zip");
}

Извлечь (распаковать) указанный файл из zip-архива в указанную директорию

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(TargetDirectory);
}

Извлечь (распаковать) все файлы из zip-архива в указанную директорию

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.Extract(TargetDirectory, ExtractExistingFileAction.OverwriteSilently); // перезаписывать существующие
  }
}

Распаковка зашифрованного (запароленного) zip архива

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    e.ExtractWithPassword(TargetDirectory, ExtractExistingFileAction.OverwriteSilently, Password);
  }
}

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

Ошибка CRC при чтении архива упакованного DotNetZip

При работе с DotNetZip можно столкнуться с тем, что иногда созданные архивы потом не распаковываются. Проблема решается путем добавления:

zip.ParallelDeflateThreshold = -1;

Эта опция отключает многопоточное архивирование и ошибка исчезает.

Категория: C#, C++

Книги по теме:

Станислава Солнечная

Программирование на С, С++

Посмотреть все книги по программированию

Комментарии к статье:

13.12.18   Гость Хорошая статья
24.05.19   Гость Спасибо за полезную статью
18.08.19   прикол по кайфу ждите обнову
26.11.19   Гость Спасибо очень помогло)))
30.12.19   Гость а без зависимостей с классами распаковки слабо?
27.10.20   Гость Огромное спасибо. Наконец-то решение для .Net 3.5
01.08.21   Гость Спасибо!
01.08.21   мАТ Огромное спасибо! Полезно!
01.08.21   мАТ ыфыффы
05.02.23   Гость Библиотека проста в использовании но сложна в установке...

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