Path::parent în Rust

Returnează calea fără ultima componentă (directorul care o conține) sau None pentru rădăcină.

Sintaxă
fn parent(&self) -> Option<&Path>
fn ancestors(&self) -> Ancestors<'_>

Ce face Path::parent

parent() taie ultima componentă: părintele lui a/b/c.txt este a/b. Pentru o cale cu o singură componentă relativă (c.txt), părintele este calea goală "", adică directorul curent. Pentru rădăcină (/) sau pentru calea goală, rezultatul este None.

Operația este doar pe text: nu verifică discul și nu rezolvă ... ancestors() dă calea și toți părinții ei, pe rând, până la capăt.

Ce returnează

Option<&Path>.

Exemple

Exemplul 1: Părinți și strămoși

use std::path::Path;

fn main() {
    for cale in ["/home/ana/poze/vara.jpg", "note.txt", "/", ""] {
        println!("{cale:?} -> {:?}", Path::new(cale).parent());
    }

    println!("strămoși:");
    for a in Path::new("proiect/src/bin/main.rs").ancestors() {
        println!("  {}", a.display());
    }
}

Rezultat

"/home/ana/poze/vara.jpg" -> Some("/home/ana/poze")
"note.txt" -> Some("")
"/" -> None
"" -> None
strămoși:
  proiect/src/bin/main.rs
  proiect/src/bin
  proiect/src
  proiect

Exemplul 2: Creează directorul părinte înainte de scriere

use std::fs;
use std::path::Path;

fn scrie_cu_directoare(cale: &Path, text: &str) -> std::io::Result<()> {
    if let Some(dir) = cale.parent() {
        fs::create_dir_all(dir)?;
    }
    fs::write(cale, text)
}

fn main() -> std::io::Result<()> {
    let cale = Path::new("export/2026/clienti.csv");
    scrie_cu_directoare(cale, "nume,oras\nAna,Iași\n")?;
    println!("scris în {}: {}", cale.parent().unwrap().display(), cale.exists());
    Ok(())
}

Rezultat

scris în export/2026: true

Greșeli frecvente

  • Presupui că parent() pentru note.txt este None: este Some(""). fs::create_dir_all("") reușește, deci codul de mai sus merge oricum.
  • Folosești parent() pe dir/.. și te aștepți la părintele real: rezultatul este dir, pentru că operația lucrează doar pe text. Pentru calea reală folosește fs::canonicalize.

Comenzi înrudite

  • Path: O cale din sistemul de fișiere, împrumutată (ca &str pentru texte); Path::new transformă un text în &Path.
  • Path::join: Lipește o cale la alta cu separatorul corect al sistemului și returnează un PathBuf nou.
  • fs::create_dir_all: Creează un director împreună cu toți părinții lui care lipsesc; nu dă eroare dacă directorul există deja.