Arbeiten mit ZIP/Archiven in C++: die Bibliotheken libzip und zlib

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++: libzip und zlib



In der modernen C++-Entwicklung besteht häufig die Notwendigkeit, Daten zu packen und zu entpacken. ZIP-Archive bleiben aufgrund ihrer Vielseitigkeit und Kompressionsunterstützung eines der beliebtesten Formate. In diesem Artikel betrachten wir zwei Schlüsselbibliotheken für die Arbeit mit ZIP in C++: libzip (High-Level-Arbeit mit Archiven) und zlib (Low-Level-Kompression). Sie erfahren, wie Sie die Bibliotheken installieren, ein Archiv erstellen, Dateien extrahieren und den Inhalt ohne Entpacken lesen.



Wichtige Bibliotheken für die Arbeit mit ZIP in C++

  • libzip — eine plattformübergreifende Bibliothek zum Erstellen, Lesen und Ändern von ZIP-Archiven. Unterstützt Verschlüsselung, Streams und Arbeit mit dem Speicher.
  • zlib — eine Low-Level-Bibliothek zur Datenkompression (Deflate-Algorithmus). Wird als Grundlage für libzip und andere Archivierer verwendet.
  • minizip — ein leichtgewichtiger Wrapper um zlib für die Arbeit mit dem ZIP-Format (oft im Lieferumfang von zlib enthalten).

Für die meisten Aufgaben wird die Verwendung von libzip empfohlen, da sie eine bequemere und sicherere API bietet.



Installation der Bibliotheken

Unter Linux (Ubuntu/Debian) erfolgt die Installation über den Paketmanager:

sudo apt-get install libzip-dev zlib1g-dev

Für macOS (Homebrew):

brew install libzip zlib

Unter Windows können Sie vcpkg verwenden oder vorkompilierte Binärdateien von den offiziellen Websites herunterladen.

Einbindung in CMakeLists.txt:

find_package(ZLIB REQUIRED)find_package(LibZip REQUIRED)target_link_libraries(your_project ZLIB::ZLIB libzip::zip)


Beispiel 1: Erstellen eines ZIP-Archivs mit libzip

Erstellen wir ein Archiv example.zip und fügen eine Textdatei hinzu:

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

int main() { const char* archive_name = "example.zip"; int err = 0;

// Öffnen des Archivs zum Schreiben zip_t* archive = zip_open(archive_name, ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Fehler beim Erstellen des Archivs: " << err << std::endl; return 1; }

// Daten zum Schreiben const char* filename = "hello.txt"; const char* content = "Привет, мир! Hello, C++!"; // Erstellen einer Datenquelle aus dem Speicher zip_source_t* source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Fehler beim Erstellen der Quelle" << std::endl; zip_close(archive); return 1; }

// Hinzufügen der Datei zum Archiv zip_int64_t index = zip_file_add(archive, filename, source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Fehler beim Hinzufügen der Datei: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }

// Schließen des Archivs zip_close(archive); std::cout << "Archiv erstellt: " << archive_name << std::endl; return 0;}


Beispiel 2: Entpacken eines ZIP-Archivs

Extrahieren wir alle Dateien aus dem Archiv in das aktuelle Verzeichnis:

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

int main() { const char* archive_name = "example.zip"; int err = 0;

// Öffnen des Archivs zum Lesen zip_t* archive = zip_open(archive_name, 0, &err); if (!archive) { std::cerr << "Fehler beim Öffnen des Archivs: " << 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) { // Abrufen des Dateinamens const char* filename = zip_get_name(archive, i, 0); if (!filename) continue;

// Öffnen der Datei

Empfehlungen