diff options
| author | Martin Habovstiak <martin.habovstiak@gmail.com> | 2021-02-06 13:16:37 +0100 |
|---|---|---|
| committer | Martin Habovstiak <martin.habovstiak@gmail.com> | 2021-02-06 22:16:54 +0100 |
| commit | 66f7f7d8a9e6e524468f5d84e73b438274c20dbb (patch) | |
| tree | 5a40ced7d98859d21e752101f44284c102a0c162 | |
| parent | 399b6452b5d9982438be208668bc758479f13725 (diff) | |
| download | rust-66f7f7d8a9e6e524468f5d84e73b438274c20dbb.tar.gz rust-66f7f7d8a9e6e524468f5d84e73b438274c20dbb.zip | |
Added `try_exists()` method to `std::path::Path`
This method is similar to the existing `exists()` method, except it doesn't silently ignore the errors, leading to less error-prone code. This change intentionally does NOT touch the documentation of `exists()` nor recommend people to use this method while it's unstable. Such changes are reserved for stabilization to prevent confusing people. Apart from that it avoids conflicts with #80979.
| -rw-r--r-- | library/std/src/path.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 1889e549338..4dd37f76efc 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -2468,6 +2468,36 @@ impl Path { fs::metadata(self).is_ok() } + /// Returns `Ok(true)` if the path points at an existing entity. + /// + /// This function will traverse symbolic links to query information about the + /// destination file. In case of broken symbolic links this will return `Ok(false)`. + /// + /// As opposed to the `exists()` method, this one doesn't silently ignore errors + /// unrelated to the path not existing. (E.g. it will return `Err(_)` in case of permission + /// denied on some of the parent directories.) + /// + /// # Examples + /// + /// ```no_run + /// #![feature(path_try_exists)] + /// + /// use std::path::Path; + /// assert!(!Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt")); + /// assert!(Path::new("/root/secret_file.txt").try_exists().is_err()); + /// ``` + // FIXME: stabilization should modify documentation of `exists()` to recommend this method + // instead. + #[unstable(feature = "path_try_exists", issue = "none")] + #[inline] + pub fn try_exists(&self) -> io::Result<bool> { + match fs::metadata(self) { + Ok(_) => Ok(true), + Err(error) if error.kind() == io::ErrorKind::NotFound => Ok(false), + Err(error) => Err(error), + } + } + /// Returns `true` if the path exists on disk and is pointing at a regular file. /// /// This function will traverse symbolic links to query information about the |
