我有这个Rust代码:
use std::env;
use std::path::{Path, PathBuf};
fn main() {
let user_home_dir: PathBuf = env::home_dir().expect("Could not find home directory.");
let images_dir = Path::new(&user_home_dir).join("\\AppData\\Local\\Packages");
println!("\nUser dir: {:?}", user_home_dir);
println!("Image folder: {:?}", images_dir);
}
此代码打印:
User dir: "C:\\Users\\username"
Image folder: "C:\\AppData\\Local\\Packages"
我的期望是它应该打印:
User dir: "C:\\Users\\username"
Image folder: "C:\\Users\\username\\AppData\\Local\\Packages"
我究竟做错了什么?
Path::join
使用与PathBuf::push
相同的语义。那些文件说......
推送绝对路径将替换现有路径:
use std::path::PathBuf; let mut path = PathBuf::from("/tmp"); path.push("/etc"); assert_eq!(path, PathBuf::from("/etc"));
\\AppData\\Local\\Packages
是绝对的。你必须先使它相对。
请不要使用像join("\\AppData\\Local\\Packages")
这样的操作系统特定代码。请使用join("AppData").join("Local").join("Packages")
,因为它使用平台路径分隔符。它也解决了你的问题,因为每个路径元素都不是绝对的。