2015-09-03 33 views
11

Lựa chọn có vẻ là giữa std::fs::PathExtstd::fs::metadata, nhưng tùy chọn thứ hai được đề xuất trong thời gian vì nó ổn định hơn. Dưới đây là đoạn code tôi đã làm việc với khi nó được dựa trên các tài liệu:Cách kiểm tra xem đường dẫn có tồn tại không?

use std::fs; 

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

Tuy nhiên, vì một lý do kỳ quặc let metadata = try!(fs::metadata(path)) vẫn đòi hỏi các chức năng để trả lại một Result<T,E> mặc dù tôi chỉ đơn giản muốn trở lại một boolean như từ assert!(metadata.is_file()).

Mặc dù có thể sẽ có nhiều thay đổi đối với điều này đủ sớm, làm cách nào tôi bỏ qua sự cố try!()?

Dưới đây là lỗi biên dịch có liên quan:

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

Bạn đã thấy [câu hỏi liên quan này] (http://stackoverflow.com/questions/30555477/try-does-not-compile) về 'try!'? Hoặc phần [Rust Book] (https://doc.rust-lang.org/book/error-handling.html) về xử lý lỗi? – Shepmaster

Trả lời

15

Lưu ý rằng nhiều lần bạn muốn làm một cái gì đó với các tập tin, như đọc nó. Trong những trường hợp đó, bạn nên thử mở nó và xử lý Result. Điều này giúp loại bỏ tình trạng cuộc đua giữa "kiểm tra xem tệp có tồn tại không" và "mở tệp nếu nó tồn tại". Nếu tất cả các bạn thực sự quan tâm là nếu nó tồn tại ...

Tính đến Rust 1.5, Path::exists ... tồn tại:

use std::path::Path; 

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

Trước Rust 1.5, bạn có thể kiểm tra xem phương pháp fs::metadata thành công:

use std::fs; 

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

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

Thở dài, một câu trả lời đơn giản như vậy. Cảm ơn @shepmaster! – Juxhin

+1

@Juxhin thường là những câu trả lời đơn giản khó tìm nhất!^_^ – Shepmaster

+0

Thật vậy. Tôi sẽ hiểu các tình huống mà bạn muốn làm nhiều hơn kiểm tra xác nhận nhưng vì tôi mới chỉ sử dụng ngôn ngữ bây giờ tôi muốn từ từ để lộ bản thân mình với API chuẩn như tôi chưa bao giờ tìm hiểu mô hình lập trình này trước đây . Cảm ơn một lần nữa :-) – Juxhin

Các vấn đề liên quan