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 Auch in der Bibliothek
Java Image I/O API: resize und crop von Bildern | Leitfaden
Java Management Extensions (JMX) — Überwachung von Java-Anwendungen
Geolokalisierung und Karten in Node.js: Bibliotheken für die Arbeit mit Karten
Internationalisierung (i18n) in Go (Golang): Vollständiger Leitfaden