2015-09-03 8 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) के बारे में '' कोशिश!? या [जंग बुक] (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()); 
} 

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

@ जुक्सिन यह अक्सर सरल उत्तरों है जो खोजने के लिए सबसे कठिन हैं!^_^ – Shepmaster

+0

दरअसल। मैं उन परिदृश्यों को समझूंगा जहां आप एक सत्यापन जांच से अधिक करना चाहते हैं, लेकिन चूंकि मैं अभी खुद को भाषा में उपयोग कर रहा हूं, इसलिए मैं धीरे-धीरे मानक एपीआई में खुद को बेनकाब करना चाहता था क्योंकि मैंने कभी भी इस प्रोग्रामिंग प्रतिमान में कभी नहीं पहुंचाया है । एक बार फिर धन्यवाद :-) – Juxhin

संबंधित मुद्दे

 संबंधित मुद्दे