Подтвердить что ты не робот

Как проверить, существует ли путь?

Выбор, по-видимому, находится между std::fs::PathExt и std::fs::metadata, но последний предлагается, поскольку он более стабилен. Ниже приведен код, с которым я работал, поскольку он основан на документах:

use std::fs;

pub fn path_exists(path: &str) -> bool {
    let metadata = try!(fs::metadata(path));
    assert!(metadata.is_file());
}

Однако по какой-то нечетной причине let metadata = try!(fs::metadata(path)) по-прежнему требуется функция для возврата Result<T,E>, хотя я просто хочу вернуть логическое значение, как показано на рисунке assert!(metadata.is_file()).

Несмотря на то, что, вероятно, будет много изменений в этом достаточно быстро, как бы обойти проблему try!()?

Ниже приведена соответствующая ошибка компилятора:

error[E0308]: mismatched types
 --> src/main.rs:4:20
  |
4 |     let metadata = try!(fs::metadata(path));
  |                    ^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found enum `std::result::Result`
  |
  = note: expected type `bool`
             found type `std::result::Result<_, _>`
  = note: this error originates in a macro outside of the current crate

error[E0308]: mismatched types
 --> src/main.rs:3:40
  |
3 |   pub fn path_exists(path: &str) -> bool {
  |  ________________________________________^
4 | |     let metadata = try!(fs::metadata(path));
5 | |     assert!(metadata.is_file());
6 | | }
  | |_^ expected (), found bool
  |
  = note: expected type `()`
             found type `bool`
4b9b3361

Ответ 1

Обратите внимание, что много раз вы хотите что-то сделать с файлом, например, прочитать его. В этих случаях имеет смысл просто попытаться открыть его и разобраться с Result. Это устраняет условие гонки между "проверкой, существует ли файл" и "открытым файлом, если он существует". Если все, что вас действительно волнует, - это если оно существует...

Ржавчина 1. 5+

Path::exists... существует:

use std::path::Path;

fn main() {
    println!("{}", Path::new("/etc/hosts").exists());
}

Как указывает ментально, Path::exists просто звонит вам fs::metadata:

pub fn exists(&self) -> bool {
    fs::metadata(self).is_ok()
}

Ржавчина 1. 0+

Вы можете проверить, успешно ли работает метод fs::metadata :

use std::fs;

pub fn path_exists(path: &str) -> bool {
    fs::metadata(path).is_ok()
}

fn main() {
    println!("{}", path_exists("/etc/hosts"));
}