gpt4 book ai didi

rust - 处理可能是驱动器号或连接到其他路径的路径的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:26:53 29 4
gpt4 key购买 nike

使用以下程序:

use std::path::Path;

fn main() {
println!("{:?}", Path::new("P:").join("A_B_C\\D\\E\\F\\G.hij"));
}

POSIX 会给你:

"P:/A_B_C\\D\\E\\F\\G.hij"

但是 Windows 会给你:

"P:A_B_C\\D\\E\\F\\G.hij"

后者不被认为是预期路径,至少 std::fs::copy 是这样。

同样的例子:

fn my_function(p: &Path) -> PathBuf {
p.join("Temp")
}

最佳答案

首先,请注意,当您指定不带尾部斜杠符号的驱动器号时,Windows API 将其解释为驱动器上当前目录的相对路径。 IE。 P:P:\ 可以引用不同的位置,P:file.txt 是一个有效路径,表示 P:\current\dir\file.txt。您可以通过更改目录并从命令提示符 dir P:dir P:\ 调用来验证它。

如果您确定要将“P:”解释为根路径,那么您可能应该手动检测它并添加根斜杠,但我认为这是一种不好的做法。

要严格解释路径前缀并构建绝对路径前缀,您可以使用 Path::canonicalize()方法,但请记住,它仅适用于目标操作系统中实际存在的驱动器/路径。

use std::path::{Path, PathBuf};

fn canonical_join<P: AsRef<Path>>(a: P, b: P) -> PathBuf {
let a = a.as_ref();
a.canonicalize()
.unwrap_or(PathBuf::from(a))
.join(b)
}

fn main() {
println!("{}", canonical_join("C:", "dir\\file.ext").display());
println!("{}", canonical_join("C:\\", "dir\\file.ext").display());
println!("{}", canonical_join("C:/", "dir\\file.ext").display());
}

关于rust - 处理可能是驱动器号或连接到其他路径的路径的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297055/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com