Note: This site is currently "Under construction". I'm migrating to a new version of my site building software. Lots of things are in a state of disrepair as a result (for example, footnote links aren't working). It's all part of the process of building in public. Most things should still be readable though.

Rust PathBuf Examples

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

Pop

Code

use std::path::PathBuf;

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

Results

/Users/alan/Desktop

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

Set Extension

Code

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

Results

/Users/alan/Desktop/alfa.v1.neo

Set File Name

Code

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

Results

/Users/alan/Desktop/bravo.v2.txt

Ancestors

Code

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

Results

/Users/alan/Desktop/alfa.v1.txt
/Users/alan/Desktop
/Users/alan
/Users
/

Canonicalize

Code

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

Results

/Users/alan/Desktop/alfa.v1.txt

Components

Code

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

Results

// Makes an iterator that produces this
Components(
    [
        RootDir,
        Normal(
            "Users",
        ),
        Normal(
            "alan",
        ),
        Normal(
            "Desktop",
        ),
        Normal(
            "alfa.v1.txt",
        ),
    ],
)

Display Name

Code

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

Results

/Users/alan/Desktop/alfa.v1.txt

Extension

Code

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

Results

txt

File Name

Code

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

Results

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)

Code

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

Results

alfa.v1

Join Paths

This creates a new path from the joined parts

Code

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

Results

/Users/alan/Desktop/alfa.v1.txt

Metadata

Code

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

Results

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

Code

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

Results

/Users/alan/Desktop/alfa.v1.txt

Strip Prefix

Code

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

Results

Desktop/alfa.v1.txt

A basic rundown of Rust path features