Path :: new(很多子目录)对Linux和Windows都足够好吗?

时间:2017-07-21 10:49:17

标签: linux windows rust

我现在没有Windows机器,但我想让我的代码跨平台。我有来自build.rs的工作代码,适用于Linux:

Path::new("dir1/dir2/dir3")

这对Windows是否正确,还是应该使用以下内容:

Path::new("dir1").join("dir2").join("dir3")

2 个答案:

答案 0 :(得分:5)

“足够好”是一个棘手的问题。它们都可以识别路径,因为Windows将正斜杠(/)视为与反向斜杠(\)相同。

但是,如果您显示用户的路径(请记住错误消息!),那么您应该努力满足平台的期望:

use std::path::Path;

fn main() {
    let p = Path::new("target/debug");
    println!("{}", p.exists());
    println!("{}", p.display());

    let p = Path::new("target").join("debug");
    println!("{}", p.exists());
    println!("{}", p.display());
}
true
target/debug
true
target\debug

此外,如果你要构建另一条路径,混合这两种样式看起来真的坏:

fn main() {
    let cwd = std::env::current_dir().expect("No CWD");

    let p = cwd.join("target/debug");
    println!("{}", p.exists());
    println!("{}", p.display());

    let p = cwd.join("target").join("debug");
    println!("{}", p.exists());
    println!("{}", p.display());
}
true
c:\Rust\dirs\target/debug
true
c:\Rust\dirs\target\debug

答案 1 :(得分:3)

Path::new("dir1/dir2/dir3")应该在Windows上完全有效。

例如:

fn main() {
    let path = Path::new("test/add_folder/hello.txt");

    let mut file = File::create(path).unwrap();
    file.write_all(b"Hello, world!").unwrap();
}
只要存在所需的文件夹,

就可以在Windows上正常运行。

然而,可以访问类似

的内容
  

C:\用户\ JOHNDOE

/c/users/johndoe不起作用,您需要改为编写c:/users/johndoe