2009-02-03 20 views
8

Estoy trabajando en un proyecto usando C++, Boost y Qt. Entiendo cómo comprimir archivos únicos y corrientes de prueba usando, por ejemplo, la función qCompress() en Qt.¿Cómo comprime un directorio de archivos usando C++?

¿Cómo puedo comprimir un directorio de varios archivos, incluidos los subdirectorios? Estoy buscando una solución multiplataforma (Mac, Win, Linux); Prefiero no disparar un montón de procesos nuevos.

¿Existe una forma estándar de combinar bytestreams de múltiples archivos en un archivo comprimido, o tal vez hay una función o método de conveniencia que estaría disponible en la biblioteca Boost iostream?

Muchas gracias por la ayuda.

Actualización: La biblioteca QuaZip se ve realmente genial. Hay un ejemplo en el paquete de descarga (en el directorio "tests") que muestra muy claramente cómo comprimir un directorio de archivos.

Actualización 2: Después de completar esta tarea en mi entorno de compilación de Linux, descubrí que QuaZip no funciona en absoluto con el compilador de Visual Studio. Es posible abordar todos los errores del compilador, pero una palabra de advertencia para cualquiera que mire este camino.

Respuesta

9

he encontrado las dos bibliotecas siguientes:

  • ZipIOS++. Parece ser C++ "puro". No enumeran a Windows explícitamente como una plataforma compatible. Así que creo que deberías probar tu suerte tú mismo.
  • QuaZIP. Basado en Qt4. En realidad se ve bien. Enumeran Windows explícitamente (usando mingw). Aparentemente, es un contenedor de C++ para [esta] biblioteca.

Ah, y por supuesto, he arrancado esos sitios de this Qt Lista de correo pregunta sobre comprimir/descomprimir de directorios :)

+0

I segundo QuaZIP. –

+0

Parece que QuaZip es el camino a seguir. ¡Gracias! – martian

+0

ZipIOS ++ tiene archivos de proyecto MSVC 6. Sin embargo, toma prestado algún código de Boost.Filesystem (¡desde 2001!), Que no se compila realmente de fábrica, al menos en mi entorno VS2008. Así que supongo que también tendré que mirar QuaZIP, o simple zlib ... – Reunanen

-1
system("zip myarchive.zip *"); 
+0

Dijo que no desea lanzar nuevos procesos. – PolyThinker

+0

Este es solo un proceso extra y es muchísimo más rápido de implementar que usar una biblioteca de terceros. Pero no sé las razones por las que no quiero iniciar otro proceso, tal vez el OP tiene memoria muy limitada o quiere más control sobre ZIP mientras se está ejecutando, pero así es como lo haría. –

+1

no se trata de engendrar nuevos procesos. esta respuesta es simplemente ignorante. ¿Qué pasa si "zip" no está instalado, qué pasa con otras plataformas y luego con Unix? –

1
+0

Hasta donde yo sé, zlib solo admite archivos .gz y no archivos .zip. –

+0

Sí, estoy buscando .zip. La biblioteca de minizip vinculada desde el sitio zlib.net podría ayudar, pero necesito profundizar un poco más ... Si alguien sabe más acerca de esta biblioteca, le agradecería que me lo contara. – martian

+0

¿Se pueden comprimir directorios completos con zlib? ¿O solo archivos individuales? – Frank

1

Sólo para que conste ...

Hoy en día, necesitaba hacer algo muy similar en Visual C++. (Aunque quería mantener la posibilidad de compilar el proyecto en otras plataformas, sin embargo, prefirió no adoptar Qt solo para este fin).

Terminó usando la biblioteca Minizip. Está escrito en C simple, pero idear un envoltorio simple de C++ era muy sencillo, y el resultado final funciona muy bien, al menos para mis propósitos.

0

Probé QuaZIP 0.4.3 en Windows con VisualStudio 2010 - todavía hay problemas, pero se pueden resolver fácilmente.

construir con VS:

  1. Uso CMake para configurar y generar solución de VS para QuaZIP.
  2. Solución abierta con VS y compilación: primero notará que no puede encontrar 'zlib.h'.
  3. Abra las preferencias para el proyecto quazip y agregue la ruta a la copia de Qt de Zlib a C/C++ -> General-> Directorios de inclusión adicionales: $ (QTDIR)/src/3rdparty/zlib.
  4. Reconstruye de nuevo y obtendrás muchas advertencias y un error C2491: dllimport problema estático en QuaZipFile :: staticMetaObject.
  5. Esto se debe a que QuaZipFile se declara como "clase QUAZIP_EXPORT QuaZipFile" y QUAZIP_EXPORT debe resolverse a Q_DECL_EXPORT para dll y a Q_DECL_IMPORT para la aplicación, en función de si QUAZIP_BUILD está definido o no. Al construir QuaZIP QUAZIP_BUILD debe definirse, pero no es así: el proceso de configuración define en su lugar un error completamente inútil "quazip_EXPORTS".
  6. Para solucionarlo, simplemente elimine "quazip_EXPORTS" de todas las configuraciones de compilación y agregue QUAZIP_BUILD en su lugar - QuaZIP ahora compilará bien.
0

He creado una envoltura alrededor de minizip agregando algunas características que necesitaba y haciéndolo más agradable de usar. ¿Utiliza el último C++ 11 y está desarrollado con Visual Studio 2013, por lo que debería funcionar de inmediato para usted.

Hay una descripción completa aquí: https://github.com/sebastiandev/zipper

se puede comprimir carpetas enteras, corrientes, vectores, etc. También una buena característica está haciendo todo completamente en la memoria.

Cuestiones relacionadas