Получить путь из структуры std::fs::File


#1

Здравствуйте,

Вот такой код:

let file = File::open("my-dir/my-file").unwrap();
panic!("{:?}", file);

Выводит вот такую ошибку:

thread 'tests::my-prj' panicked at 'File { handle: 0x64, path: "\\\\?\\C:\\projects\\my-dir\\my-file" }', src\event_store.rs:80:9

Т.е. Выводит путь к файлу на котором ошибка через дебаг {:?}. Имея только переменную file, я хочу засовывать в .expect(&format!("...", ...)) сообщение которое содержит путь к файлу (или название файла) ну и некоторые другие свои переменные…

Можно ли получить путь (название) файла не используя при этом дебаг {:?} ?

Большое спасибо.
Вопрос больше удобства…
Если такое невозможно - тоже спасибо за ответ)


#2

File такого функционала не дает. На некоторых платформах как часть внутренней реализации он хранит путь, но в общем случае для открытого файла совсем не гарантируется что:

  • у файла вообще есть какой-то путь (открыт чисто по дескриптору, например)
  • что путь, по которому файл был открыт, все еще актуален
  • что к файлу существует только один путь
  • т.п.

Есть вот такой пакет - https://docs.rs/filepath - он как раз содержит код, пробующий на основе информации из File получить к нему более-менее разумную версию пути (насколько это возможно сделать в каждой из платформ).


#3

Я понял, спасибо за развернутый ответ.

Значит для вывода ошибки будут использовать format + debug и не заморачиваться,
В других случаях, когда путь нужен - таскаю с собой в структуры…