鉴于相对路径:
PathBuf::from("./cargo_home")
Run Code Online (Sandbox Code Playgroud)
有没有办法获得绝对路径?
ale*_*han 33
添加了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));
}
Run Code Online (Sandbox Code Playgroud)
Ok("/Users/alexwlchan/Developer/so-example/src")
Ok("/Users/alexwlchan/Developer/solarized")
Run Code Online (Sandbox Code Playgroud)
您可以使用路径清洁的板条箱和很好地完成此操作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())
}
}
Run Code Online (Sandbox Code Playgroud)
如果我正确理解了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)
Run Code Online (Sandbox Code Playgroud)
这假设您的相对路径是相对于当前目录的.