2015-09-03 21 views
11

La scelta sembra essere compresa tra std::fs::PathExt e std::fs::metadata, ma per il momento è consigliabile, poiché è più stabile. Di seguito è riportato il codice che ho lavorato con quanto si basa fuori la documentazione:Come verificare se esiste un percorso?

use std::fs; 

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

Tuttavia, per qualche strana ragione let metadata = try!(fs::metadata(path)) richiede ancora la funzione per restituire un Result<T,E> anche se voglio semplicemente restituire un valore booleano come mostrato da assert!(metadata.is_file()).

Anche se ci saranno probabilmente un sacco di modifiche a questo abbastanza presto, come potrei bypassare il problema try!()?

Di seguito si riporta l'errore del compilatore rilevanti:

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

hai visto [questa domanda correlata] (http://stackoverflow.com/questions/30555477/try-does-not-compile) su '' provare!? O la sezione [Rust Book] (https://doc.rust-lang.org/book/error-handling.html) sul passaggio degli errori? – Shepmaster

risposta

15

Nota che molte volte si vuole fare qualcosa di con il file, come leggerlo. In questi casi, ha più senso cercare di aprirlo e gestire lo Result. Ciò elimina una condizione di competizione tra "controlla se il file esiste" e "apre il file se esiste". Se tutto ciò che davvero interessa è se esiste ...

Come di Rust 1.5, Path::exists ... esiste:

use std::path::Path; 

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

Prima di Rust 1.5, è possibile controllare se il metodo fs::metadata riesce:

use std::fs; 

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

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

Sigh, una risposta così semplice. Grazie a @shepmaster! – Juxhin

+1

@Juxhin sono spesso le risposte semplici che sono più difficili da trovare!^_^ – Shepmaster

+0

Infatti. Comprenderei scenari in cui vorresti fare qualcosa di più di un controllo di convalida, ma visto che mi sto abituando al linguaggio ora volevo espormi lentamente all'API standard perché non avevo mai approfondito questo paradigma di programmazione . Grazie ancora :-) – Juxhin

Problemi correlati