从PathBuf获取绝对路径

Edu*_*sta 18 rust

鉴于相对路径:

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)

  • 规范化存在一些问题.1)它将符号链接解析为规范路径,因此它必须访问文件系统.这可能会影响性能.2)如果文件不存在则失败.因此,您不能在尚未存在的路径上使用fs :: canonicalize(). (8认同)
  • 我使用fs :: canonicalize(在Mac OS X上运行)遇到了问题,是保证它会返回一个绝对路径,还是只是"规范化"相对路径?例如"../peer-dir/../second-peer-dir" - >"../ second -peer-dir" (2认同)
  • Windows 上另一个可能的陷阱:“canonicalize”(从 Rust 1.31 开始)将*扩展长度路径*前缀“\\?\”添加到路径中(请参阅 https://learn.microsoft.com/en-us/windows/桌面/FileIO/命名文件#maxpath)。确保规范化路径的使用者意识到这一点。 (2认同)

Cal*_*ssi 8

您可以使用路径清洁的板条箱和很好地完成此操作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)


xix*_*xao 8

现在有https://crates.io/crates/path-absolutize,用于处理不存在的路径。


Fly*_*FoX 7

如果我正确理解了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)

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

  • 这似乎与提问者可能没有做同样的事情.如果你使用它来"绝对"`./ x`,你最终得到`.`作为结果的一部分,而他们可能期望它**不显示.如果您尝试获取(在硬链接所施加的限制内)文本的规范路径,则区别很重要. (3认同)