Скажем, у вас есть файл, который вы хотите поместить в архив .zip:
zip a1.zip foo.dll
Мой тестовый DLL-файл составляет ~ 10 МБ, а архив оказывается 3,5 МБ.
Затем вы создаете файл с точно таким же содержимым и помещаете их в архив:
cp foo.dll bar.dll
zip a2.zip foo.dll bar.dll
Вы можете ожидать, что ZIP достаточно умен, чтобы понять, что это повторяющиеся данные и использовать только один объект сжатия внутри .zip, но это не так: a2.zip имеет размер 7.0 МБ!
В основном большинство таких утилит ведут себя аналогично (tar.gz, tar.bz2, rar в твердом режиме) - только 7zip поймал меня, и результирующий a2.7z лишь незначительно больше, чем a1.7z.
Таким образом, вопрос заключается в следующем: возможно ли создать файл .zip, чтобы избежать потери пространства? Мы создаем файлы .zip с кодом C++, который использует проект minizip из zlib.
Почему нам это надо?
Мы поставляем наше программное обеспечение в форме «.exe installer» и «.zip file». Программное обеспечение на самом деле не требует установки, вы можете просто распаковать его и использовать. Опцию .zip предпочитают крупные клиенты, которые имеют много рабочих станций и используют службы автоматического развертывания / обновления программного обеспечения.
Недавно мы представили три файла .dll, которые теперь нужно поместить в две разные папки, чтобы они использовались разными компонентами (по техническим причинам только один центральный каталог для этих файлов невозможен). Эти три .dll-файла являются точными копиями в обеих папках. Установщик .exe выясняет это, поскольку мы инструктируем его использовать один и тот же сжатый большой двоичный объект для каждого из двух назначений. Но в случае с .zip дело обстоит иначе, и полученная в результате установка становится на 15 МБ больше, что означает более широкое использование полосы пропускания, более медленное время загрузки и вызывающий раздражение тип недовольных инженеров. Кроме того, установка .zip неожиданно становится больше, чем установка .exe, поэтому нас спросят, что мы пропустили при установке .exe.
Есть несколько потенциальных решений для этого,
- Используйте 7-zip: босс, однако, категорически против этого, так как это заставляет вышеупомянутых людей с автоматическим развертыванием изменять свои сценарии для соответствия 7-zip.
- Используйте символические ссылки: если вы поместите символическую ссылку внутри .zip, которая указывает на другой файл внутри .zip, она будет сохранена как ссылка (например, с помощью параметра
--symlinks
дляzip
). Надеемся, что unarchivers под Win32 будет достаточно любезен, чтобы поддержать их и извлечь копию файла по пути, где должна быть расположена символическая ссылка. Fe WinRAR делает это, но есть много программ, которые «могут делать .zip», и я не уверен, что все так делают.