Path can inspect filename-shaped text without opening or reading from the filesystem.

Program

Play the program to choose a path string and inspect its final name and extension.

raw
path_file_parts.rs
Replay: real traced execution (multi-file project)
use std::path::Path;

fn main() {
    let raw = "src/main.rs";
    let path = Path::new(raw);
    let file = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");
    let ext = path.extension().and_then(|name| name.to_str()).unwrap_or("none");
    println!("{file}:{ext}");
}
use std::path::Path;

fn main() {
    let raw = "README.md";
    let path = Path::new(raw);
    let file = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");
    let ext = path.extension().and_then(|name| name.to_str()).unwrap_or("none");
    println!("{file}:{ext}");
}
use std::path::Path;

fn main() {
    let raw = "src/lib";
    let path = Path::new(raw);
    let file = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");
    let ext = path.extension().and_then(|name| name.to_str()).unwrap_or("none");
    println!("{file}:{ext}");
}
  1. raw ← "src/main.rs", path ← "src/main.rs", file ← "main.rs", ext ← "rs"

    3fn main() {4    let ra→ "src/main.rs"w = "src/main.rs"; //@raw="src/main.rs", "README.md", "src/lib"5    let pat→ "src/main.rs"h = Path::new(ra"src/main.rs"w);6    let fil→ "main.rs"e = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");7    let ex→ "rs"t = path.extension().and_then(|name| name.to_str()).unwrap_or("none");8    println!("{file}:{ext}");9}
    outputmain.rs:rs
  1. raw ← "README.md", path ← "README.md", file ← "README.md", ext ← "md"

    3fn main() {4    let ra→ "README.md"w = "README.md";5    let pat→ "README.md"h = Path::new(ra"README.md"w);6    let fil→ "README.md"e = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");7    let ex→ "md"t = path.extension().and_then(|name| name.to_str()).unwrap_or("none");8    println!("{file}:{ext}");9}
    outputREADME.md:md
  1. raw ← "src/lib", path ← "src/lib", file ← "lib", ext ← "none"

    3fn main() {4    let ra→ "src/lib"w = "src/lib";5    let pat→ "src/lib"h = Path::new(ra"src/lib"w);6    let fil→ "lib"e = path.file_name().and_then(|name| name.to_str()).unwrap_or("none");7    let ex→ "none"t = path.extension().and_then(|name| name.to_str()).unwrap_or("none");8    println!("{file}:{ext}");9}
    outputlib:none
Path `Path::new` treats a string as path-shaped data without touching the filesystem.
file_name `file_name` returns the last component when one is present.
extension `extension` returns the text after the last dot in the filename.