Arbeiten mit ZIP/Archiven in C++: Bibliotheken und Codebeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit ZIP/Archiven in C++: Überblick über Bibliotheken und praktische Beispiele



Datenarchivierung ist eine der Kernaufgaben in der Softwareentwicklung. C++ bietet keine integrierte Unterstützung für das ZIP-Format, jedoch gibt es mehrere ausgereifte und bewährte Bibliotheken, mit denen Sie ZIP-Archive einfach packen, entpacken und ändern können. In diesem Artikel betrachten wir die wichtigsten Werkzeuge: zlib, minizip und libzip, und geben praktische Codebeispiele.



1. Grundlegende Konzepte der Arbeit mit ZIP in C++



ZIP ist ein verlustfreies Komprimierungsformat, das mehrere Algorithmen unterstützt (Deflate, BZip2, LZMA). Für die Arbeit damit werden in C++ üblicherweise drei Ansätze verwendet:



  • Direkte Arbeit mit zlib — Low-Level-Komprimierung/Dekomprimierung von Datenströmen, jedoch ohne Unterstützung der ZIP-Dateistruktur.
  • minizip — ein Aufsatz auf zlib, der Funktionen zum Erstellen und Lesen von ZIP-Archiven bereitstellt.
  • libzip — eine voll funktionsfähige Bibliothek mit Unterstützung zum Bearbeiten, Löschen und Hinzufügen von Dateien in vorhandenen Archiven.


2. Die Bibliothek zlib



zlib ist eine grundlegende Komprimierungsbibliothek, auf der viele ZIP-Lösungen aufbauen. Sie stellt die Funktionen compress() und uncompress() für die Arbeit mit Rohdaten bereit.



Beispiel: Zeichenkette mit zlib komprimieren



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

int main() { std::string input = "Beispieltext zur Komprimierung in 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 << "Komprimiert: " << srcLen << " -> " << destLen << " Bytes"; } delete[] compressed; return 0;}


Hinweis: Für die Arbeit mit zlib muss die Header-Datei zlib.h eingebunden und mit der Bibliothek -lz gelinkt werden.



3. Die Bibliothek minizip



minizip ist ein leichtgewichtiger Wrapper um zlib, der das Erstellen und Extrahieren von ZIP-Archiven ermöglicht. Sie wird im Quellcode von zlib (Ordner contrib/minizip) mitgeliefert.



Beispiel: ZIP-Archiv mit einer Datei erstellen



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

int main() { zipFile zf = zipOpen("example.zip", APPEND_STATUS_CREATE); if (!zf) { std::cerr << "Fehler beim Erstellen des Archivs"; return 1; } zip_fileinfo info = {0}; const char* filename = "test.txt"; const char* content = "Hallo von 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 << "Archiv erstellt: example.zip"; return 0;}


Beispiel: Alle Dateien aus einem ZIP extrahieren



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

int main() { unzFile uf = unzOpen("example.zip"); if (!uf) { std::cerr << "Archiv konnte nicht geöffnet werden"; 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

Empfehlungen