Path::extension în Rust

extension() dă extensia fișierului (după ultimul punct), file_name() ultima parte a căii, fără directoare.

Sintaxă
fn extension(&self) -> Option<&OsStr>
fn file_name(&self) -> Option<&OsStr>
fn file_stem(&self) -> Option<&OsStr>

Ce face Path::extension

file_name() returnează ultima componentă a căii: pentru poze/vara.jpg este vara.jpg. extension() returnează ce urmează după ultimul punct din numele fișierului (jpg), fără punct. file_stem() dă numele fără extensie (vara).

Toate returnează Option<&OsStr>: None dacă nu există parte respectivă (de exemplu fișierul Makefile nu are extensie, iar calea .. nu are nume). Un nume care începe cu punct, ca .bashrc, nu are extensie. Compararea cu un text merge direct: ext == "txt"; pentru &str folosește to_str().

Ce returnează

Option<&OsStr>.

Exemple

Exemplul 1: Cazuri speciale

use std::path::Path;

fn main() {
    for cale in ["poze/vara.jpg", "arhiva.tar.gz", "Makefile", ".bashrc", "docs/", ".."] {
        let p = Path::new(cale);
        println!("{cale:14} nume = {:12} ext = {:?}", format!("{:?}", p.file_name()), p.extension());
    }
}

Rezultat

poze/vara.jpg  nume = Some("vara.jpg") ext = Some("jpg")
arhiva.tar.gz  nume = Some("arhiva.tar.gz") ext = Some("gz")
Makefile       nume = Some("Makefile") ext = None
.bashrc        nume = Some(".bashrc") ext = None
docs/          nume = Some("docs") ext = None
..             nume = None         ext = None

Exemplul 2: Grupare după extensie

to_ascii_lowercase() tratează la fel JPG și jpg.

use std::collections::BTreeMap;
use std::path::Path;

fn main() {
    let fisiere = ["vara.JPG", "munte.jpg", "cv.pdf", "notite", "plaja.png", "factura.pdf"];
    let mut grupe: BTreeMap<String, Vec<&str>> = BTreeMap::new();
    for f in fisiere {
        let ext = Path::new(f)
            .extension()
            .and_then(|e| e.to_str())
            .map(|e| e.to_ascii_lowercase())
            .unwrap_or_else(|| String::from("(fără)"));
        grupe.entry(ext).or_default().push(f);
    }
    for (ext, lista) in &grupe {
        println!("{ext}: {lista:?}");
    }
}

Rezultat

(fără): ["notite"]
jpg: ["vara.JPG", "munte.jpg"]
pdf: ["cv.pdf", "factura.pdf"]
png: ["plaja.png"]

Greșeli frecvente

  • Cauți extensia cu split('.').last(): pentru Makefile primești tot numele, iar pentru .bashrc primești bashrc.
  • Te aștepți ca extension() pentru arhiva.tar.gz să dea tar.gz: dă doar gz.

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ă.
  • fs::read_dir: Listează intrările (fișiere și directoare) dintr-un director, ca iterator de DirEntry.