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
Auch in der Bibliothek
Arbeiten mit YAML in Rust: Die Bibliothek serde_yaml
afero für Go: Vollständiges Tutorial mit Beispielen
Aufgabenwarteschlangen in Swift: GCD, OperationQueue und Combine für iOS/macOS
JWT-Token in Swift: Arbeiten mit JSON Web Token auf iOS/macOS
Kotlin Task Scheduler: kotlinx.coroutines und Bibliotheken für Hintergrundaufgaben