Travailler avec les archives ZIP en C++ : libzip et zlib
Dans le développement moderne en C++, il est souvent nécessaire de compresser et décompresser des données. Les archives ZIP restent l'un des formats les plus populaires grâce à leur polyvalence et leur prise en charge de la compression. Dans cet article, nous examinerons deux bibliothèques clés pour travailler avec ZIP en C++ : libzip (travail de haut niveau avec les archives) et zlib (compression de bas niveau). Vous apprendrez comment installer les bibliothèques, créer une archive, extraire des fichiers et lire le contenu sans décompression.
Bibliothèques principales pour travailler avec ZIP en C++
- libzip — bibliothèque multiplateforme pour créer, lire et modifier des archives ZIP. Prend en charge le chiffrement, les flux et le travail avec la mémoire.
- zlib — bibliothèque de compression de données de bas niveau (algorithme Deflate). Utilisée comme base pour libzip et d'autres archiveurs.
- minizip — wrapper léger autour de zlib pour travailler avec le format ZIP (souvent inclus dans zlib).
Pour la plupart des tâches, il est recommandé d'utiliser libzip, car elle fournit une API plus pratique et plus sûre.
Installation des bibliothèques
Sous Linux (Ubuntu/Debian), l'installation se fait via le gestionnaire de paquets :
sudo apt-get install libzip-dev zlib1g-devPour macOS (Homebrew) :
brew install libzip zlibSous Windows, vous pouvez utiliser vcpkg ou télécharger les binaires précompilés depuis les sites officiels.
Connexion dans CMakeLists.txt :
find_package(ZLIB REQUIRED)find_package(LibZip REQUIRED)target_link_libraries(your_project ZLIB::ZLIB libzip::zip)Exemple 1 : Création d'une archive ZIP avec libzip
Créons une archive example.zip et ajoutons-y un fichier texte :
#include <zip.h>#include <iostream>#include <string>
int main() { const char* archive_name = "example.zip"; int err = 0;
// Ouvrir l'archive en écriture zip_t* archive = zip_open(archive_name, ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Erreur de création de l'archive : " << err << std::endl; return 1; }
// Données à écrire const char* filename = "hello.txt"; const char* content = "Привет, мир! Hello, C++!"; // Créer une source de données depuis la mémoire zip_source_t* source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Erreur de création de la source" << std::endl; zip_close(archive); return 1; }
// Ajouter le fichier à l'archive zip_int64_t index = zip_file_add(archive, filename, source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Erreur d'ajout du fichier : " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }
// Fermer l'archive zip_close(archive); std::cout << "Archive créée : " << archive_name << std::endl; return 0;}Exemple 2 : Décompression d'une archive ZIP
Extrayons tous les fichiers de l'archive dans le répertoire courant :
#include <zip.h>#include <iostream>#include <fstream>
int main() { const char* archive_name = "example.zip"; int err = 0;
// Ouvrir l'archive en lecture zip_t* archive = zip_open(archive_name, 0, &err); if (!archive) { std::cerr << "Erreur d'ouverture de l'archive : " << err << std::endl; return 1; }
zip_int64_t num_entries = zip_get_num_entries(archive, 0); for (zip_int64_t i = 0; i < num_entries; ++i) { // Obtenir le nom du fichier const char* filename = zip_get_name(archive, i, 0); if (!filename) continue;
// Ouvrir le fi Aussi dans la bibliothèque
Axios — client HTTP pour JavaScript (Node.js)
Gradle Kotlin DSL pour Kotlin : guide complet avec exemples
Traitement d'images en Go : redimensionnement et recadrage (resize, crop)
Combine pour Swift : guide complet avec exemples
Envoi d'email en Kotlin : bibliothèques, exemples et configuration SMTP