Arbeiten mit dem Dateisystem in Rust: in der Praxis
Rust ist eine moderne Systemsprache, die dem Entwickler die volle Kontrolle über den Speicher gibt und gleichzeitig Sicherheit garantiert. Die Arbeit mit dem Dateisystem ist eine der grundlegenden Aufgaben, die in fast jedem Projekt gelöst werden müssen. In diesem Artikel werden wir anhand praktischer Beispiele durchgehen, wie man Dateien liest und schreibt, Verzeichnisse verwaltet und Ordner durchsucht. Alle Beispiele sind in Rust geschrieben und einsatzbereit.
Wichtige Module und Strukturen
In Rust ist das Modul std::fs (Dateisystem) für die Arbeit mit dem Dateisystem zuständig, sowie std::path für die Arbeit mit Pfaden. Die wichtigsten Typen:
std::fs::File— repräsentiert eine geöffnete Datei.std::fs::read_dir— ein Iterator über den Inhalt eines Verzeichnisses.std::path::Pathundstd::path::PathBuf— für die Arbeit mit Pfaden.
Einbinden der Module:
use std::fs;use std::path::Path;Eine Datei vollständig lesen
Der einfachste Weg, eine kleine Textdatei zu lesen, ist die Verwendung der Funktion fs::read_to_string. Sie gibt ein Result<String> zurück.
use std::fs;
fn main() { let content = fs::read_to_string("example.txt") .expect("Datei konnte nicht gelesen werden"); println!("Dateiinhalt:{}", content);}Wenn die Datei nicht existiert oder keine Zugriffsrechte vorliegen, wird das Programm mit einer Panik beendet. Verwenden Sie in echten Projekten match oder den ?-Operator zur Fehlerbehandlung.
Fehlerbehandlung beim Lesen
use std::fs;
fn read_file(path: &str) -> Result<String, std::io::Error> { fs::read_to_string(path)}
fn main() { match read_file("config.txt") { Ok(data) => println!("{}", data), Err(e) => eprintln!("Fehler: {}", e), }}Daten in eine Datei schreiben
Zum Schreiben wird fs::write (überschreibt die Datei) oder das Erstellen einer File mit den Optionen OpenOptions verwendet.
Einfaches Schreiben eines Strings
use std::fs;
fn main() { let data = "Hallo, Rust!"; fs::write("output.txt", data) .expect("Datei konnte nicht geschrieben werden"); println!("Datei erfolgreich geschrieben");}Anhängen an das Dateiende
use std::fs::OpenOptions;use std::io::Write;
fn main() { let mut file = OpenOptions::new() .append(true) .create(true) .open("log.txt") .expect("Datei konnte nicht geöffnet werden");
writeln!(file, "{} - Logeintrag", chrono::Local::now()) .expect("Schreiben fehlgeschlagen");}Beachten Sie: OpenOptions ermöglicht eine flexible Konfiguration des Modus – Erstellen, Überschreiben, Anhängen, Lesen.
Arbeiten mit Verzeichnissen
Das Erstellen, Löschen und Durchsuchen von Ordnern sind häufige Aufgaben. Betrachten wir sie.
Ein neues Verzeichnis erstellen
use std::fs;
fn main() { fs::create_dir("new_folder") .expect("Ordner konnte nicht erstellt werden"); // Verschachtelte Ordner erstellen (rekursiv) fs::create_dir_all("parent/child/grandchild") .expect("Verschachtelte Ordner konnten nicht erstellt werden");}Ein Verzeichnis löschen
use std::fs;
fn main() { // Nur leeren Ordner löschen fs::remove_dir("empty_folder").ok(); // Rekursives Löschen mit gesamten Inhalt fs::remove_dir_all("temp_data") .expect("Ordner konnte nicht gelöscht werden");}Seien Sie vorsichtig mit remove_dir_all – es löscht unwiderruflich den gesamten Inhalt.
Inhalt eines Verzeichnisses durchsuchen
Iteration über Dateien und Ordner innerhalb eines Verzeichnisses:
use std::fs;
fn main() { let entries = fs::read_dir(".") .expect("Verzeichnis konnte nicht gelesen werden");\