【发布时间】:2015-05-28 15:46:32
【问题描述】:
给定一个相对路径:
PathBuf::from("./cargo_home")
有没有办法获取绝对路径?
【问题讨论】:
标签: rust
给定一个相对路径:
PathBuf::from("./cargo_home")
有没有办法获取绝对路径?
【问题讨论】:
标签: rust
Rust 1.5.0 添加了std::fs::canonicalize,听起来非常接近您想要的:
返回路径的规范形式,其中所有中间组件均已标准化并已解析符号链接。
请注意,与接受的答案不同,这会从返回的路径中删除 ./。
我机器上的一个简单例子:
use std::fs;
use std::path::PathBuf;
fn main() {
let srcdir = PathBuf::from("./src");
println!("{:?}", fs::canonicalize(&srcdir));
let solardir = PathBuf::from("./../solarized/.");
println!("{:?}", fs::canonicalize(&solardir));
}
Ok("/Users/alexwlchan/Developer/so-example/src")
Ok("/Users/alexwlchan/Developer/solarized")
【讨论】:
canonicalize(从 Rust 1.31 开始)将 Extended length path 前缀 `\\?\` 添加到路径中(参见 docs.microsoft.com/en-us/windows/desktop/FileIO/… )。确保规范化路径的使用者知道这一点。
canonicalize可以直接使用:srcdir.canonicalize()。
您可以使用path-clean crate 和std::env::current_dir 很好地做到这一点。与其他答案相比,此方法的好处是它可以解析. 和..,即使路径不存在也可以工作。
use std::env;
use std::io;
use std::path::{PathBuf, Path};
use path_clean::PathClean;
pub fn absolute_path(path: impl AsRef<Path>) -> io::Result<PathBuf> {
let path = path.as_ref();
let absolute_path = if path.is_absolute() {
path.to_path_buf()
} else {
env::current_dir()?.join(path)
}.clean();
Ok(absolute_path)
}
【讨论】:
如果我正确理解 PathBuf 文档,它不会将 "./" 视为表示其相对路径的特殊开始。
但是,您可以使用 std::env::current_dir 将相对路径转换为绝对路径:
let relative_path = PathBuf::from("cargo_home");
let mut absolute_path = try!(std::env::current_dir());
absolute_path.push(relative_path)
这假定您的相对路径是相对于当前目录的。
【讨论】:
./x,你最终会得到. 作为结果的一部分,而他们可能希望它不会出现。如果您试图获得(在硬链接所施加的限制内)文件的规范路径,则区别很重要。
absolute_path转成字符串显示或格式化?
现在有https://crates.io/crates/path-absolutize,用于处理不存在的路径。
【讨论】: