我现在没有Windows机器,但我想让我的代码跨平台。我有来自build.rs
的工作代码,适用于Linux:
Path::new("dir1/dir2/dir3")
这对Windows是否正确,还是应该使用以下内容:
Path::new("dir1").join("dir2").join("dir3")
答案 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
。