Работа С Zip-Архивами В .Net

Недавно в моем проекте .

NET/C# мне понадобилась функциональность для создания и распаковки zip-архивов.

Казалось бы, это очень простые операции, учитывая, что Windows Explorer уже давно умеет работать с zip-файлами и я предполагал, что Microsoft предоставляет API для работы с ними.

Отсутствие классов для работы с zip в .

NET framework меня не удивило, но и не очень порадовало.

Меня раздражало отсутствие функционала по работе с zip в различных неуправляемых Windows API (WinAPI, COM-интерфейсах и т.д.).

На данный момент весь исходный код проекта разработан мной и включать в дистрибутив дополнительный сторонний файл .

dll мне не хотелось из-за простейшего функционала.

После поиска в интернете и в msdn я выбрал из следующих решений:

  1. В .

    NET Framework есть класс System.IO.Packaging.ZipPackage, но насколько я понимаю, с его помощью нельзя полноценно работать с zip-архивами, к тому же он появился только в .

    NET 3.5, к которому я не прикасался.

    очень хочу связать свой проект. Этот класс использует класс MS.Internal.IO.Zip.ZipArchive, но, как следует из названия, доступ к нему отключен.

    Интересно, почему.

  2. В .

    NET Framework для J# есть класс java.util.zip.ZipFile, а в MSDN — статья как использовать его из C#.

    Но Visual J# Framework не включен в .

    NET Framework, поэтому его необходимо включить.

    Распространяемый пакет Visual J# в свой дистрибутив, а это 3,6 мегабайта вообще бесполезного для меня кода.

    Не очень элегантно.

  3. мини-zip — надстройка для zlib, написанная на C. Для использования в .

    NET понадобится сборка dll + interop.

  4. Сторонние библиотеки SharpZipLib И ДотНетЗип .

    Оба полностью написаны и предоставляют довольно широкий спектр функций.

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

Ни один из вышеперечисленных вариантов меня не устроил полностью, поэтому я решил разработать свой.

В .

NET Framework есть класс System.IO.Compression.DeflateStream, который может упаковывать и распаковывать данные на основе алгоритма выкачивания.

Вам нужно только уметь читать/записывать внутреннюю структуру zip-архива, которая описана в разделе Характеристики .

В результате за пару дней я разработал небольшую и простую библиотеку, умеющую распаковывать и создавать zip-файлы как в файловой системе, так и в памяти:

  • Он поддерживает только алгоритм сжатия deflate и, конечно же, store.
  • Умеет работать с архивами, содержащими имена файлов в формате utf8.
  • Он нормально распаковывает zip-архивы, созданные WinRAR и, возможно, многими другими программами для Windows. Я также встречал zip-архивы, которые не поддерживаются моей библиотекой.

Конечно, в нем нет полной поддержки всего формата ZIP (шифрование, различные алгоритмы сжатия, дополнительные поля и т. д.), это колоссальный объем работы и все вышеперечисленные решения ее тоже не обеспечивают. Мое решение приемлемо только для ситуаций, когда заранее известно, что формат архива поддерживается библиотекой и архивы не будут поступать напрямую от пользователя приложения.

В моем проекте эти требования соблюдены, поэтому разработанное решение меня вполне устроило.

Я не ставил перед собой задачу разработать библиотеку с открытым исходным кодом, документацией и удобным API. Я просто хотел вам рассказать и привести пример работы с ZIP из .

NET без использования сторонних библиотек.

Вы можете скачать исходники и пример Здесь .

Буду рад, если кому-то пригодится :) Теги: #zip #Сжатие данных #Чулан

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.