2015-09-03 40 views
11

Die Wahl scheint zwischen std::fs::PathExt und std::fs::metadata zu liegen, aber letzteres wird vorerst empfohlen, da es stabiler ist. Unten ist der Code, den ich mit gearbeitet haben, wie es die Dokumentation basiert weg ist:Wie überprüft man, ob ein Pfad existiert?

use std::fs; 

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

jedoch aus irgendeinem Grund let metadata = try!(fs::metadata(path)) noch die Funktion erfordert eine Result<T,E> selbst zurückzukehren, obwohl ich nur einen boolean zurückgeben möchten, wie gezeigt von assert!(metadata.is_file()).

Auch wenn es wahrscheinlich bald genug Änderungen geben wird, wie würde ich das try!() Problem umgehen?

Im Folgenden finden Sie die entsprechenden Compiler-Fehler:

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

Haben Sie [diese Frage im Zusammenhang] (http://stackoverflow.com/questions/30555477/try-does-not-compile) über 'versuchen gesehen'!? Oder das [Rust Book] (https://doc.rust-lang.org/book/error-handling.html) Abschnitt zur Fehlerbehandlung? – Shepmaster

Antwort

15

Beachten Sie, dass viele Male Sie etwas mit der Datei machen wollen, wie es zu lesen. In diesen Fällen macht es mehr Sinn, einfach zu versuchen, es zu öffnen und mit der Result umzugehen. Dies beseitigt eine Race-Bedingung zwischen "check, um zu sehen, ob Datei existiert" und "Datei öffnen, wenn es existiert". Wenn alles kümmern Sie sich wirklich, wenn es existiert ...

Ab Rust 1.5, Path::exists ... existiert:

use std::path::Path; 

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

Vor 1,5 bis Rust, können Sie, wenn die fs::metadata Methode überprüfen gelingt es:

use std::fs; 

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

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

Seufz, so eine einfache Antwort. Danke @Shepmaster! – Juxhin

+1

@Juxhin es ist oft die einfachen Antworten, die am schwersten zu finden sind!^_^ – Shepmaster

+0

In der Tat. Ich würde Szenarien verstehen, in denen Sie mehr tun möchten als eine Validierungsprüfung, aber da ich mich erst jetzt an die Sprache gewöhnt habe, wollte ich mich nur langsam der Standard-API aussetzen, da ich noch nie in dieses Programmierparadigma eingedrungen bin . Danke noch einmal :-) – Juxhin

Verwandte Themen