home ~ projects ~ socials

Rust PathBuf Examples

These are examples of the functions and features available in Rusts PathBuf

This is a work in progress making examples from >this page>https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.display>

Pop

use std::path::PathBuf;

fn main() {
    let mut path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    path.pop();
    dbg! {path};
}
Output:
/Users/alan/Desktop

NOTE: the pop just returns true not the item that was popped as far as I can tell

Set Extension

fn main() {
    let mut path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    path.set_extension("neo");
    dbg! {path};
}
Output:
/Users/alan/Desktop/alfa.v1.neo

Set File Name

fn main() {
    let mut path = PathBuf::from("/Users/alan/Desktop/bravo.v2.txt");
    path.set_file_name("bravo.v2.txt");
    dbg! {path};
}
Output:
/Users/alan/Desktop/bravo.v2.txt

Ancestors

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let ancestors = path.ancestors();
    ancestors.for_each(|x| println!("{}", x.display()));
}
Output:
/Users/alan/Desktop/alfa.v1.txt
/Users/alan/Desktop
/Users/alan
/Users
/

Canonicalize

fn main() {
    let mut path = PathBuf::from("/Users/alan/Desktop/subdir/../alfa.v1.txt");
    path = path.canonicalize().unwrap();
    dbg! {path};
}
Output:
/Users/alan/Desktop/alfa.v1.txt

Components

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let components = path.components();
    dbg! {components};
}
Output:
// Makes an iterator that produces this
Components(
    [
        RootDir,
        Normal(
            "Users",
        ),
        Normal(
            "alan",
        ),
        Normal(
            "Desktop",
        ),
        Normal(
            "alfa.v1.txt",
        ),
    ],
)

Display Name

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let display_name = path.display();
    dbg! {display_name};
}
Output:
/Users/alan/Desktop/alfa.v1.txt

Extension

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let extension = path.extension().unwrap();
    dbg! {extension};
}
Output:
txt

File Name

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let file_name = path.file_name().unwrap();
    dbg! {file_name};
}
Output:
alfa.v1.txt

File Stem

(There's a file_prefix that's in nightly as well that will do a similar thing as thise but return alfa instead)

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let file_stem = path.file_stem().unwrap();
    dbg! {file_stem};
}
Output:
alfa.v1

Join Paths

This creates a new path from the joined parts

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop");
    let joined_path = path.join("alfa.v1.txt");
    dbg! {joined_path};
}
Output:
/Users/alan/Desktop/alfa.v1.txt

Metadata

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let metadata = path.metadata().unwrap();
    dbg! {metadata};
}
Output:
Metadata {
    file_type: FileType(
        FileType {
            mode: 33188,
        },
    ),
    is_dir: false,
    is_file: true,
    permissions: Permissions(
        FilePermissions {
            mode: 33188,
        },
    ),
    accessed: Ok(
        SystemTime {
            tv_sec: 1680741445,
            tv_nsec: 46423762,
        },
    ),
    ..
}

Parent

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let parent = path.parent().unwrap();
    dbg! {parent};
}
Output:
/Users/alan/Desktop/alfa.v1.txt

Strip Prefix

fn main() {
    let path = PathBuf::from("/Users/alan/Desktop/alfa.v1.txt");
    let prefix_removed = path.strip_prefix("/Users/alan/").unwrap();
    dbg! {prefix_removed};
}
Output:
Desktop/alfa.v1.txt
-- end of line --