сжатие файлов с помощью zlib

Могу ли я использовать функцию библиотеки zlib для сжатия файлов. Я пытаюсь выполнить сжатие файлов, используя "gzopen()", который на самом деле работает с одним файлом с некоторыми проблемами. Когда я пытаюсь распаковать выходной файл с помощью «WinZip», расширение файла отсутствует в выходных данных. Например. Если я сжимаю файл с именем «test.pdf», имя выходного файла будет «test». (содержимое файла правильное. проблема только с расширением)

     fi = (gzFile *)gzopen(destfile,"ab");
     gzwrite(fi,buff,bufflen);
     gzclose(fi);

Когда я пытаюсь сжать два разных файла (например, "test.pdf" и "sample.pdf"), после извлечения с помощью "WinZip" ("test") получается только один файл. Как использовать Zlip-файл для сжатия нескольких файлов. Я думаю, что проблема связана с информацией заголовка в сжатом файле. Могу ли я использовать zlib для сжатия файлов?


person DAC84    schedule 22.08.2012    source источник


Ответы (4)


Вы можете использовать опцию -N или --name для gzip, чтобы использовать имя файла, хранящееся в файле gzip, вместо имени файла gzip.

Вы не можете использовать gzip отдельно для хранения нескольких файлов. Для приложения Windows я бы рекомендовал libzip для нескольких файлов, который кодирует и декодирует файлы .zip. libzip использует zlib для части сжатия и распаковки.

person Mark Adler    schedule 23.08.2012
comment
Подскажите, пожалуйста, как использовать параметр -N в библиотеке gzip. Я пишу консольное приложение Windows и не очень хорошо знаком с библиотекой zlib. заранее спасибо - person DAC84; 27.08.2012
comment
Если вы хотите хранить несколько файлов, просто используйте libzip. Тогда вам не нужно беспокоиться об извлечении имени из заголовка gzip. Если вам нужно это сделать, используйте inflateGetHeader(). Все функции zlib задокументированы в zlib.h. - person Mark Adler; 27.08.2012

вы можете использовать что-то вроде http://gnuwin32.sourceforge.net/packages/libarchive.htm создать tar и заархивировать его

person Qnan    schedule 22.08.2012
comment
tar вряд ли является стандартным для Windows, zip встроен в проводник - person Martin Beckett; 22.08.2012
comment
Окна с тегом OP, щелкните zip-файл, и он просто работает. Откройте приглашение cmd и выполните zcat файл | tar tvf - или файл tar tvzf не совсем обычный для пользователей Windows - person Martin Beckett; 22.08.2012
comment
в Windows есть инструменты, которые могут избавить вас от необходимости работать с файлами tar через командную строку. - person Qnan; 22.08.2012
comment
в любом случае, @MartinBeckett, я считаю это действительным решением, особенно если архив распаковывается программно, поэтому нет необходимости минусовать, если вы чувствуете, что ваше решение лучше - person Qnan; 22.08.2012

zlib (библиотека) и gzip (утилита) на самом деле не управляют файлами. Он не имеет понятия об именах файлов, поэтому обычно утилита gunzip просто удаляет расширение .gz из извлеченного файла. В gzip-файле нет встроенных данных имени файла, он просто работает с именем файла во время его распаковки.

gzip также не поддерживает сжатие нескольких файлов в один архив. Для этого обычно вы используете команду tar для создания одного файла, содержащего отдельные файлы, которые вы хотите сжать, а затем gzip файл tar. вот почему вы часто будете видеть archive.tar.gz или archive.tgz. Это набор файлов в tar-файле, сжатом с помощью gzip.

person bearda    schedule 22.08.2012
comment
В файл, сжатый с помощью gzip, встроены есть данные имени файла. gzip будет использовать это имя с параметром -N или --name. - person Mark Adler; 23.08.2012

zlib выполняет только сжатие, он не обрабатывает имена файлов, данные файлов, расположение каталогов и т. д.

Winzip добавляет все это в протокол ZLIB. В дистрибутиве zlib есть библиотека contrib, которая дает вам функции zip.

person Martin Beckett    schedule 22.08.2012
comment
@MarkAdler Я думаю, что это была месть за то, что я проголосовал за другой ответ. - person Martin Beckett; 23.08.2012