Ce face Path::join
baza.join("fisier.txt") creează o cale nouă: baza/fisier.txt pe Linux și macOS, baza\fisier.txt pe Windows. Calea originală nu se schimbă. Poți înlănțui: dir.join("2026").join("iunie.csv").
Atenție la căile absolute: dacă argumentul începe cu / (sau cu o literă de disc pe Windows), rezultatul este doar argumentul, iar baza este ignorată. Este important când partea a doua vine de la utilizator.
Parametri
| Parametru | Descriere |
|---|---|
path |
Calea adăugată la sfârșit. |
Ce returnează
Un PathBuf nou.
Exemple
Exemplul 1: Construirea căilor pentru rapoarte
use std::fs;
use std::path::Path;
fn main() -> std::io::Result<()> {
let baza = Path::new("rapoarte");
let luna = baza.join("2026").join("octombrie");
let fisier = luna.join("vanzari.csv");
println!("director: {}", luna.display());
println!("fișier: {}", fisier.display());
fs::create_dir_all(&luna)?;
fs::write(&fisier, "zi,total\n")?;
println!("există: {}", fisier.exists());
Ok(())
}
Rezultat
director: rapoarte/2026/octombrie
fișier: rapoarte/2026/octombrie/vanzari.csv
există: true
Exemplul 2: O cale absolută înlocuiește baza
Dacă numele vine de la utilizator, verifică întâi că este relativ, ca să nu scrii în afara directorului dorit.
use std::path::Path;
fn main() {
let incarcari = Path::new("incarcari");
for nume in ["poza.jpg", "/etc/passwd", "../secret.txt"] {
let cale = incarcari.join(nume);
let sigur = Path::new(nume).is_relative() && !nume.contains("..");
println!("{nume:15} -> {:25} sigur: {sigur}", cale.display().to_string());
}
}
Rezultat
poza.jpg -> incarcari/poza.jpg sigur: true
/etc/passwd -> /etc/passwd sigur: false
../secret.txt -> incarcari/../secret.txt sigur: false
Greșeli frecvente
- Lipești bucăți cu
/în text: codul nu mai merge corect pe Windows. - Primești de la utilizator un nume de fișier și faci
joinfără verificare: un nume absolut sau cu..poate ieși din directorul tău.
Comenzi înrudite
Path: O cale din sistemul de fișiere, împrumutată (ca &str pentru texte); Path::new transformă un text în &Path.PathBuf: Calea deținută și modificabilă (ca String pentru texte): push adaugă componente, set_extension schimbă extensia.Path::parent: Returnează calea fără ultima componentă (directorul care o conține) sau None pentru rădăcină.