Biblioteca zip de código abierto multiplataforma extremadamente simple c ++

Supongamos que he definido

struct Data {
   std::string  fileName;
   char*        byteArray;
   size_t       size;
}

Quiero poder escribir algo como lo siguiente:

std::vector<Data> vectorOfData; 
// ... filling vectorOfData here ...
ZIP zipArchive; // from some library?
for (int i = 0; i < vectorOfData.size(); i++
{
  const Data& d = vectorOfData[i];
  zipArchive.insert(d.filename, d.byteArray, d.size);
}

std::string outputDestination = "/home/output.zip"
zipArchive.write(outputDestination);

Ahora, sé que eso es muy, muy simple. Lo que estoy buscando es una biblioteca que tenga esta funcionalidad y no venga con una gran cantidad de funcionalidad adicional en la que me perderé, tratando de averiguar cómo funciona.

Mis requisitos son que el código debe ejecutarse desde una aplicación C++ (¡no puedo escribir un script externo y llamar a eso, desafortunadamente!), y debe ser un código multiplataforma, para que pueda compilar en el objetivo 3 plataformas (Windows, OSX y Linux).

He examinado zlib (que no hace zips), libzip (que no tiene muchos ejemplos y tiene muchas funciones adicionales) y minizip (que tiene el mismo problema que libzip).

La razón por la que pregunto en lugar de tratar de averiguar los detalles de estas grandes bibliotecas es porque me parece realmente sorprendente que no exista una solución simple de código abierto. Estoy más tentado a escribir uno para mis necesidades específicas que confiar en una gran biblioteca que hace demasiado, pero no tengo tiempo antes de que el cliente necesite la funcionalidad:/

Entonces, ¿qué tiene de malo libzip y minizip aparte de la falta de ejemplos?

Respuestas (1)

Tu podrías intentar

Cremallera: envoltorios de C++ alrededor de minizip

Es gratis y tiene una licencia MIT (más la licencia zlib para las dependencias). Parece ser bastante sencillo de usar, por ejemplo:

  • Crear un archivo zip con 2 archivos:

    using namespace zipper;
    
    std::ifstream input1("some file");
    std::ifstream input2("some file");
    
    Zipper zipper("ziptest.zip");
    zipper.add(input1, "Test1");
    zipper.add(input2, "Test1");
    
    zipper.close();
    
  • Agregar un archivo por nombre y una carpeta completa a un zip:

    Zipper zipper("ziptest.zip");
    zipper.add("somefile.txt");
    zipper.add("myFolder");
    zipper.close();
    

Encontrará más ejemplos en la página de Zipper GitHub .