PathBuf în Rust

Calea deținută și modificabilă (ca String pentru texte): push adaugă componente, set_extension schimbă extensia.

Sintaxă
use std::path::PathBuf;

fn new() -> PathBuf
fn push<P: AsRef<Path>>(&mut self, path: P)
fn pop(&mut self) -> bool
fn set_extension<S: AsRef<OsStr>>(&mut self, extension: S) -> bool

Ce face PathBuf

PathBuf este perechea deținută a lui Path, așa cum String este a lui str. Îl creezi gol cu PathBuf::new() sau dintr-un text cu PathBuf::from("..."), iar orice metodă a lui Path funcționează direct pe el.

push(x) adaugă o componentă la final, cu separatorul corect (și, ca join, înlocuiește totul dacă x este absolută). pop() elimină ultima componentă. set_extension("ext") înlocuiește extensia (cu "" o elimină); returnează false dacă nu există nume de fișier.

Parametri

Parametru Descriere
path La push: componenta adăugată.
extension La set_extension: noua extensie, fără punct.

Ce returnează

new: un PathBuf gol. push: nimic. pop și set_extension: bool.

Exemple

Exemplul 1: Construirea și modificarea unei căi

use std::path::PathBuf;

fn main() {
    let mut cale = PathBuf::new();
    cale.push("export");
    cale.push("2026");
    cale.push("raport.txt");
    println!("{}", cale.display());

    cale.set_extension("csv");
    println!("cu altă extensie: {}", cale.display());

    cale.pop();
    cale.push("sumar.pdf");
    println!("după pop și push: {}", cale.display());

    let mut fara = PathBuf::from("arhiva.tar.gz");
    fara.set_extension("");
    println!("fără extensie: {}", fara.display());
}

Rezultat

export/2026/raport.txt
cu altă extensie: export/2026/raport.csv
după pop și push: export/2026/sumar.pdf
fără extensie: arhiva.tar

Exemplul 2: Fișiere de ieșire cu aceeași bază

Pentru fiecare imagine construim calea miniaturii: alt director, același nume, extensia webp.

use std::path::{Path, PathBuf};

fn miniatura(original: &Path) -> PathBuf {
    let mut cale = PathBuf::from("miniaturi");
    if let Some(nume) = original.file_name() {
        cale.push(nume);
    }
    cale.set_extension("webp");
    cale
}

fn main() {
    for f in ["poze/vara.jpg", "poze/iarna/munte.png", "logo.svg"] {
        println!("{f} -> {}", miniatura(Path::new(f)).display());
    }
}

Rezultat

poze/vara.jpg -> miniaturi/vara.webp
poze/iarna/munte.png -> miniaturi/munte.webp
logo.svg -> miniaturi/logo.webp

Greșeli frecvente

  • Dai lui set_extension extensia cu punct (".csv"): rezultatul este raport..csv.
  • Faci push("/tmp") și te aștepți să adauge: o cale absolută înlocuiește tot conținutul.

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.
  • Path::extension: extension() dă extensia fișierului (după ultimul punct), file_name() ultima parte a căii, fără directoare.
  • env::current_dir: Returnează directorul de lucru curent al programului, față de care se calculează căile relative.