【问题标题】:Getting the absolute path from a PathBuf从 PathBuf 获取绝对路径
【发布时间】:2015-05-28 15:46:32
【问题描述】:

给定一个相对路径:

PathBuf::from("./cargo_home")

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

【问题讨论】:

标签: rust


【解决方案1】:

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)它将符号链接解析为规范路径,因此它必须访问文件系统。这会影响性能。 2)如果文件不存在则失败。因此,您不能在(尚)不存在的路径上使用 fs::canonicalize()。
  • 我在使用 fs::canonicalize(在 Mac OS X 上运行)时遇到了问题,是否保证它会返回绝对路径,或者它只是“规范化”相对路径?例如"../peer-dir/../second-peer-dir" --> "../second-peer-dir"
  • Windows 上另一个可能的陷阱:canonicalize(从 Rust 1.31 开始)将 Extended length path 前缀 `\\?\` 添加到路径中(参见 docs.microsoft.com/en-us/windows/desktop/FileIO/… )。确保规范化路径的使用者知道这一点。
  • 请注意 fs::canonicalize 在 Windows 上使用 UNC 路径。所以结果可能不是你在 Windows 上想要的。见github.com/rust-lang/rust/issues/42869
  • 还有别名方法canonicalize可以直接使用:srcdir.canonicalize()
【解决方案2】:

您可以使用path-clean crate 和std::env::current_dir 很好地做到这一点。与其他答案相比,此方法的好处是它可以解析...,即使路径不存在也可以工作。

use std::env;
use std::io;
use std::path::{PathBuf, Path};

use path_clean::PathClean;

pub fn absolute_path(path: impl AsRef<Path>) -> io::Result<PathBuf> {
    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)
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 这似乎与提问者的意图不太一样。如果你用它来“绝对化”./x,你最终会得到. 作为结果的一部分,而他们可能希望它不会出现。如果您试图获得(在硬链接所施加的限制内)文件的规范路径,则区别很重要。
    • 我不会删除你的答案;它仍然可以在其他答案失败的某些条件下工作(例如,没有创建文件)。
    • 如何将absolute_path转成字符串显示或格式化?
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 2012-08-27
      • 1970-01-01
      • 2011-08-11
      • 2010-09-21
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多