PathBuf::starts_with doesn't work with backslashes

use std::path::PathBuf;

fn main() {
    let p = PathBuf::from(r"\\?\C:\test");
    println!("{}", p.starts_with(r"\\?\"));
    println!("{}", p.starts_with("r\\"));
    println!("{}", p.to_string_lossy().starts_with(r"\\?\"));
}

Results:

false
false
true

When I try the same with / instead of \ then it works as expected. Why doesn't starts_with work with backslashes?

TL;DR: Windows extended paths are messy and annoying. \\?\ is "effectively" ignored (as it (roughly, I don't really understand extended paths) just explicitly states "look for a drive name"), so the PathBuf API skips it for the path introspection API, such that \\?\C:\path behaves the same as C:\path.

//?/C:/path doesn't have this behavior, because it isn't a Windows extended path. (In fact, windows file explorer will try to treat this path as a URI and open it in your browser.)

Thanks for your answer. BTW: \\?\ just tells Windows to break the 260 characters limitation for paths. IMHO this is just a workaround for a broken design.

This behavior of PathBuf is annoying and should be explicitly mentioned in the docs.

1 Like

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.