Function std::path::absolute

source ·
pub fn absolute<P: AsRef<Path>>(path: P) -> Result<PathBuf>
🔬This is a nightly-only experimental API. (absolute_path #92750)
Expand description

在不访问文件系统的情况下使路径成为绝对路径。

如果路径是相对的,则将当前目录用作基本目录。 所有中间组件都将根据特定于平台的规则进行解析,但与 canonicalize 不同,它不会解析符号链接,即使路径不存在也可能成功。

如果 path 为空或获取 current directory 失败,则返回错误。

Examples

Posix 路径

#![feature(absolute_path)]
fn main() -> std::io::Result<()> {
  use std::path::{self, Path};

  // 相对于绝对
  let absolute = path::absolute("foo/./bar")?;
  assert!(absolute.ends_with("foo/bar"));

  // 绝对到绝对
  let absolute = path::absolute("/foo//test/.././bar.rs")?;
  assert_eq!(absolute, Path::new("/foo/test/../bar.rs"));
  Ok(())
}
Run

该路径是使用 POSIX semantics 解析的,只是它没有解析符号链接。这意味着它将保留 .. 组件和尾部斜杠。

Windows 路径

#![feature(absolute_path)]
fn main() -> std::io::Result<()> {
  use std::path::{self, Path};

  // 相对于绝对
  let absolute = path::absolute("foo/./bar")?;
  assert!(absolute.ends_with(r"foo\bar"));

  // 绝对到绝对
  let absolute = path::absolute(r"C:\foo//test\..\./bar.rs")?;

  assert_eq!(absolute, Path::new(r"C:\foo\bar.rs"));
  Ok(())
}
Run

对于逐字路径,这将简单地返回给定的路径。对于其他路径,这目前相当于调用 GetFullPathNameW 这可能会在 future 中发生变化。