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(): pentruMakefileprimești tot numele, iar pentru.bashrcprimeștibashrc. - Te aștepți ca
extension()pentruarhiva.tar.gzsă deatar.gz: dă doargz.
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.