Arbeiten mit ZIP-Archiven in Rust mit der Bibliothek zip
Bei der Entwicklung in Rust besteht häufig die Notwendigkeit, Dateien in ZIP-Archive zu packen oder Daten daraus zu extrahieren. Dies kann für die Verteilung von Software, die Erstellung von Backups, die Verarbeitung von hochgeladenen Benutzerarchiven oder die Paketerstellung erforderlich sein. Die Standardbibliothek von Rust enthält keine integrierten Werkzeuge für die Arbeit mit ZIP, jedoch bietet das Ökosystem eine leistungsstarke und praktische Bibliothek zip.
In diesem Artikel werden wir im Detail besprechen, wie man die Bibliothek zip zum Erstellen, Lesen und Extrahieren von ZIP-Archiven verwendet. Sie erfahren, wie Sie die Bibliothek installieren, mit Dateien und Verzeichnissen arbeiten, Fehler behandeln und die Komprimierung verwalten.
Installation der Bibliothek zip
Fügen Sie zunächst die Abhängigkeit in die Datei Cargo.toml Ihres Projekts hinzu:
[dependencies]zip = "2.2"Die Bibliothek wird aktiv gepflegt und nutzt moderne Rust-Funktionen. Nach dem Hinzufügen der Abhängigkeit können Sie sie in den Code importieren:
use zip::ZipWriter;use zip::read::ZipArchive;use std::io::{Read, Write, BufWriter, BufReader};use std::fs::{self, File};Erstellen eines ZIP-Archivs
Das Erstellen eines Archivs besteht aus mehreren Schritten: Öffnen einer Datei zum Schreiben, Initialisieren von ZipWriter, Hinzufügen von Dateien und Abschließen des Schreibvorgangs. Betrachten wir ein Beispiel, das eine einzelne Textdatei packt:
use std::fs::File;use zip::ZipWriter;use zip::write::FileOptions;use std::io::Write;
fn create_archive() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);
let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .unix_permissions(0o755);
zip.start_file("hello.txt", options)?; zip.write_all(b"Hello, Rust ZIP!")?;
zip.finish()?; Ok(())}Hier haben wir:
- Die Datei
example.zipim aktuellen Verzeichnis erstellt. - Den
ZipWriterinitialisiert. - Die Dateiparameter konfiguriert: Komprimierungsmethode
Deflated(Standardkomprimierung) und Zugriffsrechte. - Die Datei
hello.txthinzugefügt und den Inhalt hineingeschrieben. - Den Schreibvorgang mit dem Aufruf von
finish()abgeschlossen.
Um mehrere Dateien oder ein ganzes Verzeichnis hinzuzufügen, verwenden Sie eine Schleife über die Dateien im Ordner:
fn add_directory(zip: &mut ZipWriter<File>, dir_path: &str) -> zip::result::ZipResult<()> { for entry in walkdir::WalkDir::new(dir_path) { let entry = entry?; let path = entry.path(); if path.is_file() { let name = path.strip_prefix(dir_path).unwrap().to_str().unwrap(); zip.start_file(name, FileOptions::default())?; let mut f = File::open(path)?; std::io::copy(&mut f, zip)?; } } Ok(())}Beachten Sie: Für das rekursive Durchlaufen von Verzeichnissen ist die Crate walkdir praktisch, die jedoch separat hinzugefügt werden muss.
Lesen und Extrahieren eines ZIP-Archivs
Zum Lesen eines Archivs wird ZipArchive verwendet. Nachfolgend ein Beispiel, das die Liste der Dateien im Archiv ausgibt und sie in einen angegebenen Ordner extrahiert:
use zip::ZipArchive;use std::io::Read;
fn extract_archive(archive_path: &str, output_dir: &str) -> zip::result::ZipResult<()> { let file = File::open(archive_path)?; let mut archive = ZipArchive::new(file)?;
for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let entry_name = entry.name().to_string(); println!("Wird extrahiert: {}", entry_name);
// Vollständigen Pfad zur Datei erstellen let output_path = format!("{}/{}", output_dir, entry_nam Auch in der Bibliothek
E-Mail-Versand in Rust: Die Bibliotheken lettre und mailparse für E-Mails
Aufgabenplaner in Go (Golang): Leitfaden zur Implementierung von Cron-Jobs
Room für Kotlin: Vollständiger Leitfaden mit Beispielen
QR-Code-Generator in Go (Golang) mit der Bibliothek go-qrcode
Redis-Client für Node.js: ioredis – ein leistungsstarkes Tool für die Arbeit mit Redis