Ce face Path::exists
exists() returnează true dacă la acea cale se află un fișier sau un director. is_file() și is_dir() verifică și tipul. Toate trei returnează false și în caz de eroare (de exemplu, fără permisiune de acces), fără să spună de ce.
Dacă vrei să deosebești „nu există” de „nu am voie să verific”, folosește try_exists(), care returnează io::Result<bool>. Pentru a deschide un fișier, nu verifica întâi cu exists(): deschide-l direct și tratează eroarea, ca să eviți situația în care fișierul dispare între verificare și deschidere.
Ce returnează
bool.
Exemple
Exemplul 1: Fișier, director sau nimic
use std::fs;
use std::path::Path;
fn main() -> std::io::Result<()> {
fs::create_dir_all("proiect/src")?;
fs::write("proiect/Cargo.toml", "[package]\nname = \"salut\"\n")?;
for cale in ["proiect", "proiect/Cargo.toml", "proiect/src", "proiect/README.md"] {
let p = Path::new(cale);
println!("{cale:20} exists = {:5} is_file = {:5} is_dir = {}", p.exists(), p.is_file(), p.is_dir());
}
println!("try_exists: {:?}", Path::new("proiect/README.md").try_exists());
Ok(())
}
Rezultat
proiect exists = true is_file = false is_dir = true
proiect/Cargo.toml exists = true is_file = true is_dir = false
proiect/src exists = true is_file = false is_dir = true
proiect/README.md exists = false is_file = false is_dir = false
try_exists: Ok(false)
Exemplul 2: Găsește primul fișier de configurare existent
use std::fs;
use std::path::Path;
fn main() -> std::io::Result<()> {
fs::create_dir_all("config")?;
fs::write("config/implicit.toml", "port = 8080\n")?;
let candidati = ["setari.toml", "config/local.toml", "config/implicit.toml"];
match candidati.iter().map(Path::new).find(|p| p.is_file()) {
Some(p) => println!("folosesc {}", p.display()),
None => println!("nu am găsit nicio configurare"),
}
Ok(())
}
Rezultat
folosesc config/implicit.toml
Greșeli frecvente
- Scrii
if cale.exists() { File::open(cale)? }: între verificare și deschidere fișierul poate fi șters. Deschide direct și trateazăNotFound. - Interpretezi
falseca „nu există”: poate fi și o problemă de permisiuni. Foloseștetry_exists()dacă diferența contează.
Comenzi înrudite
Path: O cale din sistemul de fișiere, împrumutată (ca &str pentru texte); Path::new transformă un text în &Path.fs::metadata: Informații despre un fișier sau director: dimensiune, tip, permisiuni, data modificării.fs::create_dir_all: Creează un director împreună cu toți părinții lui care lipsesc; nu dă eroare dacă directorul există deja.