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