Travailler avec les archives ZIP en C++ : la bibliothèque libzip et exemples de code

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++ : du simple au complexe



Dans le développement moderne en C++, il est souvent nécessaire de compresser et décompresser des données. Que ce soit pour sauvegarder des configurations, transmettre des journaux ou créer des sauvegardes — le travail avec les archives ZIP reste l'une des compétences les plus recherchées. Dans cet article, nous allons détailler deux bibliothèques populaires : libzip (officielle, puissante) et miniz (légère, à en-tête unique). Vous apprendrez à créer, lire et modifier des archives ZIP, et obtiendrez des exemples de code prêts à l'emploi.



Pourquoi le format ZIP ?

Le format ZIP est le standard de facto pour la compression sans perte. Il est pris en charge par tous les systèmes d'exploitation, permet de stocker plusieurs fichiers et dossiers, et prend en charge le chiffrement et le traitement en flux. En C++, il n'y a pas de prise en charge intégrée du ZIP (à l'exception du <filesystem> expérimental), nous utilisons donc des bibliothèques tierces.



La bibliothèque libzip : un outil puissant pour les tâches sérieuses

libzip est une bibliothèque multiplateforme en C, avec une excellente API compatible C++. Elle offre un contrôle total sur les archives : création, lecture, modification, suppression de fichiers, gestion des commentaires et des métadonnées.



Installation de libzip (Linux/macOS)

# Ubuntu/Debiansudo apt-get install libzip-dev

# macOS (Homebrew)brew install libzip

# Windows — via vcpkg ou téléchargement depuis le site libzip.org


Exemple 1 : Création d'une archive ZIP

Créons une archive example.zip et ajoutons-y un fichier texte.

#include <zip.h>#include <iostream>#include <string>

int main() { // Ouvrir l'archive en écriture (APPEND_CREATE en crée une nouvelle) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Erreur de création de l'archive : " << err << std::endl; return 1; }

// Données pour le fichier const char *content = "Bonjour de PythonLib!"; zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Impossible de créer la source de données" << std::endl; zip_close(archive); return 1; }

// Ajouter le fichier à l'archive zip_int64_t index = zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Impossible d'ajouter le 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 avec succès !" << std::endl; return 0;}


Exemple 2 : Extraction de tous les fichiers d'une archive

Lisons l'archive et extrayons tous les fichiers dans le répertoire courant.

#include <zip.h>#include <iostream>#include <fstream>

int main() { int err = 0; zip_t *archive = zip_open("example.zip", ZIP_RDONLY, &err); if (!archive) { std::cerr << "Erreur d'ouverture de l'archive" << 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 fichier dans l'archive zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "Impossible d'ouvrir : " << filename << std::endl; continue; }

// Lire les données et les écrire dans un fichier char buffer[1024]; std::ofstream out(filename, std::ios::binary); zip_int64_t bytes_read; while ((bytes_read = zip_fread(zf, buffer, sizeof(buffer))) > 0) { out.write(b

Recommendations