Travailler avec les ZIP/archives en C++ : bibliothèques 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 ZIP/archives en C++ : aperçu des bibliothèques et exemples pratiques



L'archivage de données est l'une des tâches clés dans le développement de logiciels. En C++, il n'existe pas de support intégré pour le format ZIP, mais plusieurs bibliothèques matures et éprouvées permettent de compresser, décompresser et modifier facilement des archives ZIP. Dans cet article, nous examinerons les principaux outils : zlib, minizip et libzip, et fournirons des exemples pratiques de code.



1. Concepts de base du travail avec ZIP en C++



ZIP est un format de compression sans perte qui prend en charge plusieurs algorithmes (Deflate, BZip2, LZMA). Pour travailler avec lui en C++, trois approches sont généralement utilisées :



  • Travail direct avec zlib — compression/décompression de bas niveau de flux de données, mais sans prise en charge de la structure du fichier ZIP.
  • minizip — une surcouche de zlib, fournissant des fonctions pour créer et lire des archives ZIP.
  • libzip — une bibliothèque complète avec prise en charge de l'édition, de la suppression et de l'ajout de fichiers dans des archives existantes.


2. Bibliothèque zlib



zlib est une bibliothèque de compression fondamentale sur laquelle reposent de nombreuses solutions ZIP. Elle fournit les fonctions compress() et uncompress() pour travailler avec des données brutes.



Exemple : compression d'une chaîne avec zlib



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

int main() { std::string input = "Exemple de texte à compresser en C++!"; uLong srcLen = input.size(); uLong destLen = compressBound(srcLen); char* compressed = new char[destLen]; if (compress((Bytef*)compressed, &destLen, (const Bytef*)input.data(), srcLen) == Z_OK) { std::cout << "Compressé : " << srcLen << " -> " << destLen << " octets"; } delete[] compressed; return 0;}


Remarque : Pour travailler avec zlib, il est nécessaire d'inclure le fichier d'en-tête zlib.h et de lier la bibliothèque -lz.



3. Bibliothèque minizip



minizip est une surcouche légère de zlib qui permet de créer et d'extraire des archives ZIP. Elle est distribuée dans les sources de zlib (dossier contrib/minizip).



Exemple : création d'une archive ZIP avec un seul fichier



#include <iostream>#include <zip.h>  // minizip

int main() { zipFile zf = zipOpen("example.zip", APPEND_STATUS_CREATE); if (!zf) { std::cerr << "Erreur de création de l'archive"; return 1; } zip_fileinfo info = {0}; const char* filename = "test.txt"; const char* content = "Bonjour de minizip!"; if (zipOpenNewFileInZip(zf, filename, &info, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION) == ZIP_OK) { zipWriteInFileInZip(zf, content, strlen(content)); zipCloseFileInZip(zf); } zipClose(zf, nullptr); std::cout << "Archive créée : example.zip"; return 0;}


Exemple : extraction de tous les fichiers d'un ZIP



#include <iostream>#include <unzip.h>

int main() { unzFile uf = unzOpen("example.zip"); if (!uf) { std::cerr << "Impossible d'ouvrir l'archive"; return 1; } unz_global_info global_info; unzGetGlobalInfo(uf, &global_info); for (uLong i = 0; i < global_info.number_entry; ++i) { char filename[256]; unz_file_info file_info; unzGetCurrentFileInfo(uf, &file_info, filename, sizeof(filename), nullptr, 0, nullptr, 0); if (unzOpenCurrentFile(uf) == UNZ_OK) { c

Recommendations