Пользователь
0,0
рейтинг
6 февраля 2011 в 12:08

Разработка → Небольшое тестирование двух библиотек для работы с ZIP архивами (язык C#)

.NET*
Архивирование

Не раз приходилось работать с zip архивами с помощью C#, в моих случаях — это было скачивание архива с базой, потом извлекал базу на диск, если это был не текстовый файл, то динамически подключал базу данных, иначе просто считывал необходимые мне данные. Для этих целей я использовал ZipStorer, он мне нравиться тем, что очень просто делает возложенную на него работу, мало весит и является классом, который с минимальным количеством телодвижений оказывается в исполняемом файле. Сегодня я решил попробовать что-то другое, для чего выбрал две библиотеки SharpZipLib и DotNetZip, после чего провел небольшое тестирование, чтобы понять какая из них может мне быть полезной в будущем.

Раз уже упомянул о ZipStorer, то покажу пример работы с ним, достаточно добавить класс ZipStorer.cs и написать такой метод, после чего всё будет работать:
  private void Unzip(string fileInput, string saveFile)
    {
        // Open an existing zip file for reading
        using (ZipStorer zip = ZipStorer.Open(fileInput, FileAccess.Read))
        {
          // Read the central directory collection
          List<ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir();

          // Look for the desired file
          string DBfile = string.Empty;
          foreach (ZipStorer.ZipFileEntry entry in dir)
          {
            if (Path.GetFileName(entry.FilenameInZip).ToLower().IndexOf(".txt") != -1)
            {
              DBfile = Path.GetFileName(entry.FilenameInZip);
              zip.ExtractFile(entry, saveFile + DBfile);

              //Now we can connect to database or read file
            }
          }
        }
    }


* This source code was highlighted with Source Code Highlighter.

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

Лицензии:
SharpZipLib — GPL
DotNetZip — Ms-PL

В этот раз я решил не переводить информацию с сайтов разработчиков, скажу лишь, что обе библиотеки имеют поддержку Compact Framework и могут использоваться в веб-приложениях. Размер обеих библиотек около 200 килобайт, правда для DotNetZip я беру «Reduced» версию, полная версия занимает около 400 килобайт, что в два раза больше. Теперь перейдём непосредственно к тесту, в отличии от ZipStorer, мы будем архивировать данные, а сравнивать будем степень сжатия и скорость. Архивировать будем с уровнем, установленным по умолчанию, для DotNetZip свойство CompressionLevel установлено в «Default» или «Level6», а метод GetLevel() для SharpZipLib возвращает «6».

Библиотеки имеют классы с одинаковыми именами, поэтому пространства я подключил таким образом:
using test1 = Ionic.Zip;
using test2 = ICSharpCode.SharpZipLib.Zip;


Для архивирования с помощью DotNetZip достаточно следующего кода:
      string ZipFileToCreate = Application.StartupPath + @"\test1.zip";
      string FileToZip = textBoxFile.Text;
      using (test1.ZipFile zip = new test1.ZipFile())
      {
         test1.ZipEntry ze = zip.AddFile(FileToZip);
         zip.Save(ZipFileToCreate);
      }


* This source code was highlighted with Source Code Highlighter.

Для SharpZipLib нужно немного больше написать:
        string file = textBoxFile.Text;
        using (test2.ZipOutputStream s = new test2.ZipOutputStream(File.Create(Application.StartupPath + @"\test2.zip")))
        {
          byte[] buffer = new byte[4096];
          test2.ZipEntry entry = new test2.ZipEntry(Path.GetFileName(file));
          s.PutNextEntry(entry);
          using (FileStream fs = File.OpenRead(file))
          {
            int sourceBytes;
            do
            {
              sourceBytes = fs.Read(buffer, 0, buffer.Length);
              s.Write(buffer, 0, sourceBytes);
            } while (sourceBytes > 0);
          }
          s.Finish();
          s.Close();
        }


* This source code was highlighted with Source Code Highlighter.

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

Результыты теста

Файлы для теста были сгенерированы искусственно, поэтому столь красивый результат сжатия, чтобы посмотреть насколько ситуация изменится с реальными данными, я скачаю список ru доменов с сайта регистратора, архив, который я скачал, будет эталоном, его размер равен 28 043 005 байт, извлеку данные из архива и ещё раз проверю две библиотеки:

Результыты теста

Вывод


Исходя из результатов, скоростные характеристики лучше у DotNetZip, но в тоже время сжатие данных у данной библиотеки хуже, напомню, что степень сжатия я не менял и она у обеих библиотек равна была 6. Лично мне визуально больше понравилась DotNetZip, на ней я и остановлюсь, число скачавших данную библиотеку больше 100 тысяч говорит о том, что выбор мой не одинок.
@eforce
карма
46,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (20)

  • +2
    На самом деле работа с SharpZipLib не требует столько кода, как вы написали :) Если немного разобраться с его нутром. Однако есть некоторые не прямые моменты, особенно это касается добавление файла в определенную папку архива. Вы еще забыли перечислить алгоритмы сжатия, которые поддерживает SharpZipLib. Для быстрой работы у него есть классик FastZip. Увы лицензия на него, как я понял не позволяет использовать в платных продуктах.
    • 0
      За основу я взял пример «CreateZipFile», FastZip я тоже видел в примерах, но обилие дополнительного кода в примере отбило желание его использовать. Касательно алгоритмов сжатия, то это Zip, GZip, Tar и BZip2, но в статье я упомянул, что в этот раз не буду заниматься переводом, полное описание обеих библиотек доступно по ссылкам.
      • 0
        Касательно алгоритмов сжатия, то это Zip, GZip, Tar и BZip2

        А какие из них можно использовать в ZIP-файлах, не опасаясь что у кого-то сегодня могут возникнуть затруднения с его открытием?
        • 0
          Не очень понятен вопрос, ZIP архивами являются только первые. Обе библиотеки делают стандартные архивы, для DotNetZip ответ даже находится на главной странице (искать можно по строке «If I create a zipfile with this library, can I open it from within a Java/PHP/Python/C/Perl application? From within WinRar/WinZIP?»). А вот пример «проблем» для SharpZipLib, т.е. устранение проблем совместимости сводится в настройке. Хотя с другой стороны, в комментариях ниже, упоминается о проблемах перехода с одной библиотеки на другую при работе с gzip.
          • 0
            Не очень понятен вопрос, ZIP архивами являются только первые.

            А, ясно. Я думал все (не заметил правда что Вы и tar там перечислили). Думал я так потому, что AFAIK ZIP-это какбы типа контейнер (по типу AVI/MKV/итп для видео, которое внутри может быть в виде сжатом самыми разными кодеками). Я в своё время где-то читал что формат ZIP развивается и в него добавляются всё новые современные методы компрессии (например в версии формата ZIP 2.0 была добавлена поддержка метода Deflate, который использовался в 7z). И это хоть само по себе и здорово, но логика подсказывает что, к примеру, встроенная в WinXP зиповалка скорее всего не прожуёт zip-файл, в котором данные сжаты по какому-нибудь методу, добавленному в ZIP-стандарт только в последние годы.
    • 0
      Насчет лицензии SharpZipLib вы не правы, как и автор поста, т.к. там есть прямая оговорка, разрешающая использовать SharpZipLib в коммерческих проектах с закрытым исходным кодом.
  • –7
    Это все как-то прозаично. Вот если бы вы алгоритм ZIP под GPU написали или, скажем, показали как это хардвэрно на FPGA крутится, было бы интересно.
  • 0
    интересно было бы услышать об использовании многоядерности современных процессоров в одном и другом случае, может быть оптимизация под многопоточность так влияет?
    • 0
      Хороший комментарий, т.к. забыл упомянуть, что тестирование велось на компьютере с AMD Athlon 64 X2 Dual Core Processor 3800+ (2,01 ГГц) и 2 Гб оперативной памяти.
      • +1
        а как с загрузкой ядер?
        в обоих случаях одинаковая? просто такая большая разница вызывает подозрение что один из вариантов использует многопоточность, а другой — нет
        • +1
          1 — DotNetZip
          2 — SharpZipLib
          3 — ZipStorer (упоминается в комментариях ниже)

          another test
  • 0
    1. А если попробовать добиться похожих результатов в итоговых размерах файлах и сравнить время?
    2. Может таки включить в тестирование и ZipStorer? Тогда будет более понятно, почему вы заменяете его на DotNetZip
    • 0
      А еще было бы неплохо сравнить скорость распаковки.
    • 0
      1. К сожалению уже поздно, т.к. тестовые файлы я удалил, придется переделывать весь тест.
      2. Немного не справедливо сравнивать ZipStorer с этими двумя библиотеками, но результаты получились такие для режима Deflate: 37 520 469 байт, 13687 мс. По скорости близка к DotNetZip, но вот сжатие практически на 30 процентов хуже.
  • 0
    Есть ещё такая небольшая подстава в том, что не всегда легко получится с одной библиотеки в проекте «пересесть» на другую.
    Из личного печального опыта: gzip, запакованный SharpZipLib не всегда разворачивается DotNetZip-ом.
  • 0
    К плюсам SharpZipLib можно отнести также реализацию алгоритма BZip2 и наличие версий под Silverlight и WP7 (последняя немного с ограниченной функциональностью).
  • +2
    Год назад я тестировал разные библиотеки для работы с Zip. Использовал сначала SharpZipLib, потом выяснилось, что в этой библиотеке есть особенность: мне необходимо было проверять наличие пароля у готового архива, т.е. распаковывать только архив, защищенный паролем, с SharpZipLib это не удалось сделать (было давно, может я не разобрался), с DotNetZip все работает.
    Библиотеку использовал на устройстве с Windows CE с .NET CF, сохранилась табличка сравнения скорости архивации, при разном уровне сжатия:

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