Получение абсолютного пути от PathBuf

Учитывая относительный путь:

PathBuf::from("./cargo_home")

Есть ли способ получить абсолютный путь?

Ответ 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")

Ответ 2

Если я правильно понимаю документацию 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)

Это предполагает, что ваш относительный путь относительно вашего текущего каталога.