Как мне заархивировать каталог файлов с помощью C ++? - PullRequest
8 голосов
/ 03 февраля 2009

Я работаю над проектом, использующим C ++, Boost и Qt. Я понимаю, как сжимать отдельные файлы и потоки, используя, например, функцию qCompress () в Qt.

Как мне заархивировать каталог из нескольких файлов, включая подкаталоги? Я ищу кроссплатформенное (Mac, Win, Linux) решение; Я бы предпочел не запускать кучу новых процессов.

Существует ли стандартный способ объединения байтовых потоков из нескольких файлов в заархивированный архив, или, может быть, есть удобная функция или метод, который будет доступен в библиотеке Boost iostream?

Большое спасибо за помощь.

Обновление : библиотека QuaZip выглядит действительно великолепно. В пакете загрузки (в каталоге «tests») есть пример, который очень четко показывает, как заархивировать каталог файлов.

Обновление 2 : выполнив эту задачу в моей среде сборки Linux, я обнаружил, что QuaZip вообще не работает с компилятором Visual Studio. Может быть возможно устранить все эти ошибки компилятора, но предостережение всем, кто смотрит по этому пути.

Ответы [ 6 ]

9 голосов
/ 03 февраля 2009

Я нашел следующие две библиотеки:

  • ZipIOS ++ . Кажется, "чистый" C ++. Они не указывают Windows явно как поддерживаемую платформу. Так что я думаю, что вы должны попытать счастья самостоятельно.
  • QuaZIP . Основано на Qt4. На самом деле выглядит красиво. Они перечисляют Windows явно (используя mingw). По-видимому, это оболочка C ++ для [this] библиотеки.

Ах, и, конечно, я извлек эти сайты из этого Qt Mailinglist вопроса о Zip / Unzipping из каталогов:)

1 голос
/ 08 апреля 2009

Только для записи ...

Сегодня мне нужно было сделать нечто очень похожее в Visual C ++. (Хотелось бы сохранить возможность компилировать проект на других платформах; однако предпочел не принимать Qt только для этой цели.)

Завершено с использованием библиотеки Minizip . Он написан на простом C, но разработка простой обертки C ++ вокруг него была легкой задачей, и конечный результат прекрасно работает, по крайней мере, для моих целей.

1 голос
/ 03 февраля 2009
0 голосов
/ 26 июля 2015

Я построил оболочку вокруг минизипа, добавив в нее некоторые необходимые функции и сделав ее более удобной для использования. Is использует новейший c ++ 11 и разработан с использованием Visual Studio 2013, поэтому он должен работать «из коробки».

Здесь есть полное описание: https://github.com/sebastiandev/zipper

Вы можете архивировать целые папки, потоки, векторы и т. Д. Также хорошая функция - делать все целиком в памяти.

0 голосов
/ 30 сентября 2011

Я пробовал QuaZIP 0.4.3 в Windows с VisualStudio 2010 - проблемы все еще существуют, но их легко решить.

Для сборки с VS:

  1. Используйте CMake для настройки и создания решения VS для QuaZIP.
  2. Откройте Soltion с VS и соберите - вы сначала заметите, что он не может найти 'zlib.h'.
  3. Откройте настройки для проекта quazip и добавьте путь к копии Qt Zlib в C / C ++ -> Общие-> Дополнительные каталоги включения: $ (QTDIR) /src/3rdparty/zlib.
  4. Перестройте заново, и вы получите множество предупреждений и одну ошибку. C2491: dllimport статическая проблема в QuaZipFile :: staticMetaObject.
  5. Это потому, что QuaZipFile объявлен как «класс QUAZIP_EXPORT QuaZipFile», а QUAZIP_EXPORT необходимо разрешить Q_DECL_EXPORT для dll и Q_DECL_IMPORT для приложения, основываясь на том, определен ли QUAZIP_BUILD или нет. При сборке QuaZIP необходимо определить QUAZIP_BUILD, но это не так - процесс конфигурации по ошибке определяет совершенно бесполезный «quazip_EXPORTS».
  6. Чтобы исправить, просто удалите «quazip_EXPORTS» из всех конфигураций сборки и добавьте вместо него QUAZIP_BUILD - теперь QuaZIP будет работать нормально.
0 голосов
/ 03 февраля 2009
system("zip myarchive.zip *");
...