Arbeiten mit ZIP-Archiven in Rust: Die Bibliothek zip zum Erstellen und Entpacken von Archiven

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 die Arbeit mit Archiven in Rust



In der modernen Entwicklung mit Rust besteht häufig die Notwendigkeit, Daten in ZIP-Archive zu packen oder daraus zu extrahieren. Ob für die Erstellung von Backups, die Verteilung von Software oder die Verarbeitung von Benutzerdateien – die Bibliothek zip ist die Standardlösung für diese Aufgabe. Sie bietet eine praktische API zum Lesen, Schreiben und Ändern von ZIP-Archiven und unterstützt sowohl die Stream-Verarbeitung als auch die Arbeit im Speicher.



Installation und Einbindung



Fügen Sie zunächst die Abhängigkeit zu Ihrer Cargo.toml hinzu:



[dependencies]zip = "2.1"


Möglicherweise wird auch die Crate std::io für die Arbeit mit Datenströmen benötigt, die bereits in der Standardbibliothek von Rust enthalten ist.



Erstellen eines neuen ZIP-Archivs



Betrachten wir ein einfaches Beispiel – das Erstellen eines Archivs mit einer Textdatei. Dazu wird ZipWriter verwendet, der jeden Typ umschließt, der Write implementiert:



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

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

zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Hallo, Rust ZIP!")?;

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


Beachten Sie die Methode start_file – sie beginnt das Schreiben einer neuen Datei innerhalb des Archivs. Sie können ihr Komprimierungsoptionen, Änderungsdatum und andere Parameter übergeben.



Lesen und Extrahieren von Dateien



Zum Lesen eines Archivs wird ZipArchive verwendet. Es ermöglicht das Durchlaufen aller Einträge und das Extrahieren ihres Inhalts:



use std::fs::File;use std::io::Read;use zip::ZipArchive;

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

for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); let mut content = String::new(); entry.read_to_string(&mut content)?; println!("{}: {}", name, content); } Ok(())}


Die Methode by_index gibt einen bestimmten Eintrag anhand des Index zurück. Es ist auch eine Suche nach Namen über by_name möglich, aber beachten Sie – Namen in ZIP können in verschiedenen Kodierungen vorliegen.



Hinzufügen von Dateien zu einem vorhandenen Archiv



Die Bibliothek zip unterstützt auch das Hinzufügen neuer Dateien zu einem bereits erstellten Archiv. Dies erfolgt mit der Methode raw_copy_file oder durch Öffnen des Archivs im Anhängemodus:



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

fn append_to_zip() -> zip::result::ZipResult<()> { let file = File::options() .read(true) .write(true) .open("example.zip")?; let mut zip = ZipWriter::new_append(file)?;

zip.start_file("new_file.txt", FileOptions::default())?; zip.write_all(b"Später hinzugefügt!")?;

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


Wichtig: Zum Hinzufügen einer Datei muss das Archiv mit Lese- und Schreibrechten geöffnet sein, und die Datei selbst darf nicht beschädigt sein.



Arbeiten mit verschiedenen Komprimierungstypen



Standardmäßig verwendet die Bibliothek die Methode Deflated (Standard-ZIP-Komprimierung). Sie können sie auf Stored (ohne Komprimierung) oder andere Methoden ändern, indem Sie die entsprechenden Optionen übergeben:



use zip::CompressionMethod;use zip::write::FileOptions;

let options = FileOptions::default() .compression_method(CompressionMethod::Stored);// oderlet options = FileOptions::default() .compression_method(CompressionMethod::Deflated);


Wenn Sie maximale Komprimierung benötigen, geben Sie die Stufe an:



<                    

Empfehlungen