Path::join în Rust

Lipește o cale la alta cu separatorul corect al sistemului și returnează un PathBuf nou.

Sintaxă
fn join<P: AsRef<Path>>(&self, path: P) -> PathBuf

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 join fă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ă.