Path :: join不执行预期的操作

时间:2018-07-14 15:57:17

标签: rust

我有这个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"

我在做什么错了?

2 个答案:

答案 0 :(得分:5)

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是绝对的。您必须先使其相对。

答案 1 :(得分:0)

请不要使用操作系统特定的代码,例如join("\\AppData\\Local\\Packages")。 请使用join("AppData").join("Local").join("Packages"),因为它使用平台路径分隔符。它还可以解决您的问题,因为每个路径元素都不是绝对的。