2015-09-03 3 views
11

Выбор, по-видимому, находится между 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` 
+0

вы видели [это связано вопрос] (http://stackoverflow.com/questions/30555477/try-does-not-compile) о '' попробовать!? Или раздел [Rust Book] (https://doc.rust-lang.org/book/error-handling.html) о передаче ошибок? – Shepmaster

ответ

15

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

Как Руст 1.5, Path::exists ... существует:

use std::path::Path; 

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

До Rust 1.5, вы можете проверить, если метод fs::metadata преуспевает:

use std::fs; 

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

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

Вздох, такой простой ответ. Спасибо @shepmaster! – Juxhin

+1

@Juxhin это часто простые ответы, которые трудно найти!^_^ – Shepmaster

+0

Действительно. Я бы понял сценарии, в которых вы хотели бы сделать больше, чем проверку валидации, но так как я просто привык к языку, теперь я хотел бы просто выставить себя на стандартный API, поскольку я никогда не вникал в эту парадигму программирования раньше , Еще раз спасибо :-) – Juxhin

Смежные вопросы