2013-09-10 7 views
5

У меня есть приложение на C++, которое требует использования стандартного формата сжатия для каталога. Я думал об использовании формата zip. И поэтому zlib был очевиден.Использование zlib для сжатия каталога

Проблема заключается в создании словаря, то есть в сжатии каталога, содержащего некоторые файлы с zlib, в стандартный zip-файл.

Я читал, что zlib делает это, но я не понимаю, как это сделать. Я проверил код minzip. Кажется, он использует gzip. Я мог бы создать свой собственный формат, но я хочу открыть эти файлы, используя 7z для отладки (на всякий случай).

Что следует использовать в zlib для сжатия каталога?

[править] В minzip я использовал minzip сжать 1 файл в его GZ версии -> не пронестись но хорошо для меня. (Я буду иметь это на различных компиляторах в мире - иметь стандартный формат проще, если на клиентской платформе есть проблема)

Также есть этот код в main. Он перебирает список файлов и записывает их на выход. Но где находится информация о местоположении файла в архиве?

do { 
     if (uncompr) { 
      if (copyout) { 
       file = gzopen(*argv, "rb"); 
       if (file == NULL) 
        fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); 
       else 
        gz_uncompress(file, stdout); 
      } else { 
       file_uncompress(*argv); 
      } 
     } else { 
      if (copyout) { 
       FILE * in = fopen(*argv, "rb"); 

       if (in == NULL) { 
        perror(*argv); 
       } else { 
        file = gzdopen(fileno(stdout), outmode); 
        if (file == NULL) error("can't gzdopen stdout"); 

        gz_compress(in, file); 
       } 

      } else { 
       file_compress(*argv, outmode); 
      } 
     } 
    } while (argv++, --argc); 

Извините, если это очевидно.

+1

Есть хорошая причина, почему работает 'zip', чтобы сделать работу не проще, и надежнее? –

+0

В папке zlib 'contrib' есть' minizip'. –

+0

Да, я видел это, но я не вижу, как передать ему папку. Может быть, список файлов. но тогда как построить словарь? – dzada

ответ

1

Я был недопониманием немного ZIP и сжатия.

Наконец-то я решил реализовать формат ZIP-архива после wikipedia, этого page. И я много раз использовал инструмент HxD на окнах и 7z для многого.

В конце я узнал, что формат архива прост, и я поддерживаю только 1 диск, N файлов с каталогами и сжатие на основе zlib. Я также использую zlib для контрольной суммы crc32.

поэтому, если у кого-то проблемы в будущем, посмотрите формат zip на wikipedia и используйте zlib для crc32, а затем, если вы хотите сжать свои куски с помощью zlib.

Благодаря всем вам

2

Не смешивайте zip-стандарт для архива, который может содержать несколько файлов в нем, и zlib - который используется в zip для сжатия одного файла/потока данных. Чтобы сжать каталог, вы должны использовать minizip/infozip или любую другую библиотеку, которая совместима с форматом ZIP-архива.

+1

, так как я уже пробовал с minzip, как это удается? Мне удалось сжать 1 файл в файл «.gz», который я могу открыть с помощью 7z. Но я не понимаю, где находится информация о файлах в файле .gz. – dzada

+0

Нет. gzip просто сжимает необработанные данные - это не формат архива; у него нет какой-либо концепции файлов. – duskwuff

+0

Хорошо, и есть ли lib, который я могу использовать для создания этого словаря? – dzada

5

Посмотрите на minizip.c пример использования мини-диска для создания ZIP-файлов. minizip находится в каталоге contrib для дистрибутива zlib, что означает, что это сторонний код. Это не часть библиотеки zlib.

Обратите внимание, что gzip не является почтой. Формат zlib не является почтовым индексом. Исходные данные дефляции не является почтовым индексом. Все это разные форматы. Исходные данные дефляции являются одним из сжатых форматов, разрешенных в пределах формата zip, и на самом деле является наиболее распространенным. zlib полезен для обработки zip-файлов, но сам по себе это не делает. zlib сам по себе обеспечивает только механизмы сжатия и декомпрессии и вычисления CRC.

+0

Спасибо, что я прочитал стандарт формата zip (быстро) сегодня, я получил это, zip это формат архива. На самом деле мне больше нужен формат архива, чем сжатие. Я хочу сделать zip, потому что он встроен во все ОС. Я пытаюсь понять, проще ли писать упаковку формата zip и использовать zlib для сжатия. Лучший – dzada

Смежные вопросы