Travailler avec les ZIP/archives en C++ : bibliothèques libzip et zlib

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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-dev

Pour macOS (Homebrew) :

brew install libzip zlib

Sous 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

Recommendations