给出相对路径:
PathBuf::from("./cargo_home")
有没有办法获得绝对路径?
答案 0 :(得分:32)
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")
答案 1 :(得分:6)
如果我正确理解了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)
这假设您的相对路径是相对于当前目录的。
答案 2 :(得分:4)
您可以使用path-clean板条箱和std::env::current_dir
很好地完成此操作。与其他答案相比,此方法的好处是它可以解析.
和..
,即使路径不存在也可以使用。
use std::env;
use std::io;
use std::path::{PathBuf, Path};
use path_clean::PathClean;
pub fn absolute_path<P>(path: P) -> io::Result<PathBuf>
where
P: AsRef<Path>,
{
let path = path.as_ref();
if path.is_absolute() {
Ok(path.to_path_buf().clean())
} else {
Ok(env::current_dir()?.join(path).clean())
}
}
答案 3 :(得分:2)
现在有 https://crates.io/crates/path-absolutize,用于处理不存在的路径。