Pull to refresh

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

Reading time 5 min
Views 29K
Архивирование

Не раз приходилось работать с 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 тысяч говорит о том, что выбор мой не одинок.
Tags:
Hubs:
+25
Comments 20
Comments Comments 20

Articles