Поддержка 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;
Эта опция отключает многопоточное архивирование и ошибка исчезает.
Комментарии к статье:
Добавить комментарий: