Arbeit mit ZIP/Archiven in C++: Bibliothek libzip 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

Arbeit mit ZIP-Archiven in C++: vom Einfachen zum Komplexen



In der modernen C++-Entwicklung entsteht oft die Notwendigkeit, Daten zu packen und zu entpacken. Ob es um das Speichern von Konfigurationen, das Übertragen von Logs oder das Erstellen von Backups geht – die Arbeit mit ZIP-Archiven bleibt eine der gefragtesten Fähigkeiten. In diesem Artikel werden wir zwei beliebte Bibliotheken im Detail besprechen: libzip (offiziell, leistungsstark) und miniz (leicht, Single-Header). Sie erfahren, wie Sie ZIP-Archive erstellen, lesen und ändern, und erhalten fertige Codebeispiele.



Warum gerade ZIP?

Das ZIP-Format ist der De-facto-Standard für verlustfreie Kompression. Es wird von allen Betriebssystemen unterstützt, ermöglicht das Speichern mehrerer Dateien und Ordner und unterstützt Verschlüsselung sowie Stream-Verarbeitung. In C++ gibt es keine integrierte ZIP-Unterstützung (außer dem experimentellen <filesystem>), daher verwenden wir externe Bibliotheken.



Die Bibliothek libzip: Ein leistungsstarkes Werkzeug für ernsthafte Aufgaben

libzip ist eine plattformübergreifende C-Bibliothek mit einer hervorragenden C++-kompatiblen API. Sie bietet vollständige Kontrolle über Archive: Erstellen, Lesen, Ändern, Löschen von Dateien, Arbeiten mit Kommentaren und Metadaten.



Installation von libzip (Linux/macOS)

# Ubuntu/Debiansudo apt-get install libzip-dev

# macOS (Homebrew)brew install libzip

# Windows – über vcpkg oder Download von libzip.org


Beispiel 1: Erstellen eines ZIP-Archivs

Wir erstellen ein Archiv example.zip und fügen eine Textdatei hinzu.

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

int main() { // Archiv zum Schreiben öffnen (APPEND_CREATE erstellt ein neues) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Fehler beim Erstellen des Archivs: " << err << std::endl; return 1; }

// Daten für die Datei const char *content = "Hallo von PythonLib!"; zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Datenquelle konnte nicht erstellt werden" << std::endl; zip_close(archive); return 1; }

// Datei zum Archiv hinzufügen zip_int64_t index = zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Datei konnte nicht hinzugefügt werden: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }

// Archiv schließen zip_close(archive); std::cout << "Archiv erfolgreich erstellt!" << std::endl; return 0;}


Beispiel 2: Entpacken aller Dateien aus einem Archiv

Wir lesen das Archiv und extrahieren alle Dateien in das aktuelle Verzeichnis.

#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 << "Fehler beim Öffnen des Archivs" << 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) { // Dateinamen abrufen const char *filename = zip_get_name(archive, i, 0); if (!filename) continue;

// Datei im Archiv öffnen zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "Konnte nicht öffnen: " << filename << std::endl; continue; }

// Daten lesen und in Datei schreiben 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

Empfehlungen