Extrem einfache plattformübergreifende Opensource-Zip-Bibliothek c++

Angenommen, ich habe definiert

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

Ich möchte in der Lage sein, etwas wie das Folgende zu schreiben:

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);

Nun, ich weiß, das ist wirklich, wirklich einfach. Was ich suche, ist eine Bibliothek, die diese Funktionalität hat und nicht mit einer riesigen Menge an zusätzlicher Funktionalität kommt, in der ich mich verlieren werde, wenn ich versuche herauszufinden, wie es funktioniert.

Meine Anforderungen sind, dass der Code innerhalb einer C++-Anwendung ausgeführt werden muss (ich kann leider kein Skript außerhalb schreiben und das aufrufen!), und es muss plattformübergreifender Code sein, damit ich auf dem Ziel 3 kompilieren kann Plattformen (Windows, OSX und Linux).

Ich habe mir zlib (das keine Reißverschlüsse macht), libzip (das nicht viele Beispiele und viele zusätzliche Funktionen enthält) und minizip (das das gleiche Problem wie libzip hat) angesehen.

Der Grund, warum ich frage, anstatt zu versuchen, die Details dieser großen Bibliotheken herauszufinden, ist, dass ich es wirklich überraschend finde, dass es keine einfache Open-Source-Lösung gibt. Ich bin eher versucht, selbst eine für meine spezifischen Bedürfnisse zu schreiben, als mich auf eine große Bibliothek zu verlassen, die zu viel leistet, aber ich habe keine Zeit, bevor der Client die Funktionalität benötigt :/

Also, was ist falsch an libzip und minizip außer dem Mangel an Beispielen?

Antworten (1)

Du könntest es versuchen

Zipper - C++-Wrapper um Minizip

Es ist kostenlos und hat eine MIT-Lizenz (plus die zlib-Lizenz für die Abhängigkeiten). Es scheint ziemlich einfach zu bedienen zu sein, zB:

  • Erstellen einer Zip-Datei mit 2 Dateien:

    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();
    
  • Hinzufügen einer Datei nach Namen und eines ganzen Ordners zu einer ZIP-Datei:

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

Weitere Beispiele finden Sie auf der Zipper-GitHub-Seite .