snippetrustCritical
How to check whether a path exists?
Viewed 0 times
howcheckexistswhetherpath
Problem
The choice seems to be between
However, for some odd reason
Even though there will probably be a lot of changes to this soon enough, how would I bypass the
Below is the relevant compiler error:
std::fs::PathExt and std::fs::metadata, but the latter is suggested for the time being as it is more stable. Below is the code I have been working with as it is based off the docs:use std::fs;
pub fn path_exists(path: &str) -> bool {
let metadata = try!(fs::metadata(path));
assert!(metadata.is_file());
}However, for some odd reason
let metadata = try!(fs::metadata(path)) still requires the function to return a Result even though I simply want to return a boolean as shown from assert!(metadata.is_file()).Even though there will probably be a lot of changes to this soon enough, how would I bypass the
try!() issue? Below is the relevant compiler error:
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
Solution
Note that many times you want to do something with the file, like read it. In those cases, it makes more sense to just try to open it and deal with the
Rust 1.5+
As mental points out,
Rust 1.0+
You can check if the
Result. This eliminates a race condition between "check to see if file exists" and "open file if it exists". If all you really care about is if it exists...Rust 1.5+
Path::exists... exists:use std::path::Path;
fn main() {
println!("{}", Path::new("/etc/hosts").exists());
}As mental points out,
Path::exists simply calls fs::metadata for you:pub fn exists(&self) -> bool {
fs::metadata(self).is_ok()
}Rust 1.0+
You can check if the
fs::metadata method succeeds:use std::fs;
pub fn path_exists(path: &str) -> bool {
fs::metadata(path).is_ok()
}
fn main() {
println!("{}", path_exists("/etc/hosts"));
}Code Snippets
use std::path::Path;
fn main() {
println!("{}", Path::new("/etc/hosts").exists());
}pub fn exists(&self) -> bool {
fs::metadata(self).is_ok()
}use std::fs;
pub fn path_exists(path: &str) -> bool {
fs::metadata(path).is_ok()
}
fn main() {
println!("{}", path_exists("/etc/hosts"));
}Context
Stack Overflow Q#32384594, score: 245
Revisions (0)
No revisions yet.