Il existe plusieurs librairies qui permettent de lire et écrire des archives, mais je n'ai malheureusement trouvé aucune qui soit en C++ standard. Même la librairie QT actuelle (5.1.0) n'intègre pas de gestion d'archive (ou alors il faut intégrer QuaZip).

La librairie libzip permet de traiter les archives de manière relativement simple en C. De plus elle est utilisée dans de nombreux gros projet. J'ai donc créé un repository sur GitHub que j'ai nommé libzippp.

L'installation est relativement simple sous linux (assurez-vous d'avoir les commandes git et make)

git clone "https://github.com/ctabin/libzippp.git"
cd libzippp
make libzip
make

Ces commandes vont télécharger la librairie lizbip, l'installer et la compiler puis faire de même pour libzippp. Il n'y a plus qu'a référencer les headers et les librairies (statiques ou dynamiques) pour pouvoir l'utiliser (il y a un petit exemple dans le README).

L'utilisation est vraiment très simple. Voici un exemple de lecture et extraction d'un fichier texte:

#include "libzippp.h"
 
//namespace de libzippp
using namespace libzippp;
 
//déclaration de l'archive à lire
ZipArchive myZip("test.zip");
 
//ouverture en lecture seule
myZip.open(ZipArchive::READ_ONLY);
 
//récupération de l'entrée à traiter
ZipEntry myFileInZip = myZip.getEntry("folder/file.txt");
 
//lecture d'un fichier texte
int contentSize = myFileInZip.getSize();
char* data = (char*)myZip.readEntry(myFileInZip);
//...
delete data;
 
//fermeture de l'archive
myZip.close();

Il est également très facile de créer/modifier une archive. Les modifications effectives sont enregistrées lorsque la méthode close est appelée. Il est également possible d'annuler toute les modification en appelant la méthode discard.

ZipArchive myZip("test.zip");
myZip.open(ZipArchive::WRITE);
 
//suppression d'une entrée et de tout son contenu récursivement
myZip.deleteEntry("mydir/");
 
//renommage d'une entrée (avec déplacement du contenu)
ZipEntry od = myZip.getEntry("otherdir/subdir/");
myZip.renameEntry(od, "maindir/");
 
//ajout d'un fichier texte
string someContent = "This is a basic text file";
myZip.addData("myFile.txt", someContent.c_str(), someContent.length()); 
 
//enregistrement de l'archive
myZip.close();

L'API n'est pas encore complètement (il manque notamment la gestion des archive encryptée). La prochaine étape est de faire en sorte que cela soit compilable sous windows.

Edit

Suite aux conseils des développeurs de libzip, j'ai renommé ZipFile en ZipArchive.