diva123
1
i have pathbuf which looks like this
let p :PathBuf = PathBuf::new("/path/to/file/file.txt"); // Here p has absolute path of file.txt
i want to create a new PathBuf variable from p which will have relative path
i.e
q : PathBuf = file/file.txt
How do i do this?
The most straightforward way to do this is with the Path::strip_prefix()
method.
let path = Path::new("/test/haha/foo.txt");
assert_eq!(path.strip_prefix("/"), Ok(Path::new("test/haha/foo.txt")));
assert_eq!(path.strip_prefix("/test"), Ok(Path::new("haha/foo.txt")));
assert_eq!(path.strip_prefix("/test/"), Ok(Path::new("haha/foo.txt")));
assert_eq!(path.strip_prefix("/test/haha/foo.txt"), Ok(Path::new("")));
assert_eq!(path.strip_prefix("/test/haha/foo.txt/"), Ok(Path::new("")));
It's a purely text-based method though, and doesn't take into account symlinks and the like.
2 Likes
jofas
3
You could use an iterator for that maybe? Hard to guess what the underlying algorithm for extraction is with only your example.
use std::path::PathBuf;
fn main() {
let p: PathBuf = PathBuf::from("/path/to/file/file.txt");
let q: PathBuf = p.iter().skip(3).collect();
assert_eq!(q, PathBuf::from("file/file.txt"));
}
Playground.