从PathBuf获取绝对路径

问题描述 投票:18回答:3

给出相对路径:

PathBuf::from("./cargo_home")

是否有获取绝对路径的方法?

rust
3个回答
34
投票

Rust 1.5.0添加了std::fs::canonicalize,听起来很接近您想要的内容:

返回规范化所有中间组件且解析符号链接的路径的规范形式。

注意,与接受的答案不同,这将从返回的路径中删除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));
}

9
投票

您可以使用Ok("/Users/alexwlchan/Developer/so-example/src") Ok("/Users/alexwlchan/Developer/solarized") 条板箱和path-clean很好地完成此操作。与其他答案相比,此方法的好处在于它可以解析std::env::current_dirstd::env::current_dir,即使路径不存在也可以使用。

.

8
投票

如果我正确理解PathBuf文档,则不会将..视为表示其相对路径的特殊开头。

但是您可以使用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(); let absolute_path = if path.is_absolute() { path.to_path_buf() } else { env::current_dir()?.join(path) }.clean(); Ok(absolute_path) } 将相对路径变成绝对路径:

"./"

这假设您的相对路径是相对于当前目录的。

© www.soinside.com 2019 - 2024. All rights reserved.