从PathBuf获取绝对路径

时间:2015-05-28 15:46:32

标签: rust

给出相对路径:

PathBuf::from("./cargo_home")

有没有办法获得绝对路径?

4 个答案:

答案 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,用于处理不存在的路径。