Path::exists în Rust

Întreabă sistemul dacă la cale există ceva (exists), dacă este un fișier (is_file) sau un director (is_dir).

Sintaxă
fn exists(&self) -> bool
fn is_file(&self) -> bool
fn is_dir(&self) -> bool

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 false ca „nu există”: poate fi și o problemă de permisiuni. Folosește try_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.