Arbeiten mit ZIP/Archiven in Rust: Die Bibliothek zip und vollständige Anleitung

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

Die Bibliothek zip für Rust: Vollständige Anleitung zum Arbeiten mit ZIP-Archiven



In der modernen Entwicklung mit Rust ist das Arbeiten mit Archiven eine gefragte Aufgabe. Ob es um das Packen von Logs, das Entpacken von Konfigurationen oder das Erstellen von Backups geht – die Standardbibliothek zip (Crate zip) ist die De-facto-Lösung zum Lesen und Schreiben von ZIP-Dateien. In diesem Artikel werden wir im Detail besprechen, wie man die Bibliothek installiert, ein Archiv erstellt, Dateien extrahiert und fortgeschrittene Techniken wie die Arbeit mit Passwörtern, Streams und großen Datenmengen betrachtet.



Installation und Einbindung



Fügen Sie die Abhängigkeit in Cargo.toml hinzu:



[dependencies]zip = "2.1"


Importieren Sie anschließend die notwendigen Module im Code:



use std::fs::File;use std::io::{Read, Write, BufReader, BufWriter};use zip::ZipWriter;use zip::write::FileOptions;use zip::read::ZipArchive;


Erstellen eines ZIP-Archivs



Zum Erstellen eines neuen Archivs wird ZipWriter verwendet. Betrachten wir ein einfaches Beispiel – wir packen zwei Textdateien:



use std::fs::File;use std::io::Write;use zip::ZipWriter;use zip::write::FileOptions;

fn create_archive() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);

// Erste Datei hinzufügen zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Hallo, Rust-Archiv!")?;

// Zweite Datei mit Kompression hinzufügen let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .unix_permissions(0o755); zip.start_file("data/config.json", options)?; zip.write_all(b"{\\"version\\": 1}")?;

zip.finish()?; Ok(())}


Wichtig: Die Methode start_file öffnet eine neue Datei innerhalb des Archivs. Die Optionen erlauben es, die Kompressionsmethode festzulegen (standardmäßig Stored – ohne Kompression, Deflated – Standard-ZIP-Kompression).



Lesen und Extrahieren eines Archivs



Zum Lesen wird ZipArchive verwendet. Unten ist eine Funktion, die die Liste der Dateien ausgibt und sie in das aktuelle Verzeichnis extrahiert:



use std::fs::File;use std::io::{Read, BufReader};use zip::ZipArchive;

fn extract_archive() -> zip::result::ZipResult<()> { let file = File::open("example.zip")?; let reader = BufReader::new(file); let mut archive = ZipArchive::new(reader)?;

for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); println!("Extrahiere: {}", name);

// Datei auf der Festplatte erstellen let mut output = File::create(&name)?; std::io::copy(&mut entry, &mut output)?; } Ok(())}


Die Methode by_index gibt einen Iterator über die Einträge zurück. Wenn ein Zugriff über den Namen benötigt wird, verwenden Sie by_name("path/to/file.txt"). Beachten Sie: Namen in ZIP können Pfade mit dem Trennzeichen / enthalten – das ist für die Plattformunabhängigkeit normal.



Arbeiten mit Passwörtern (Verschlüsselung)



Die Bibliothek zip unterstützt passwortbasierte Verschlüsselung über den AES-Algorithmus (standardmäßig AES-256). Zum Erstellen eines verschlüsselten Archivs:



use zip::ZipWriter;use zip::write::FileOptions;use zip::AesMode;

fn create_encrypted_archive() -> zip::result::ZipResult<()> { let file = File::create("secret.zip")?; let mut zip = ZipWriter::new(file);

let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .with_aes_encryption(AesMode::Aes256, "my_strong_password");

zip.start_file("secret.txt", options)?; zip.write_all(b"Top secret data")?; zip.finish()?; Ok(())}


Zum Lesen eines verschlüsselten Archivs übergeben Sie das Passwort an die Methode by_index_decrypt oder by_n

Empfehlungen