about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMartin Habovstiak <martin.habovstiak@gmail.com>2021-02-06 13:16:37 +0100
committerMartin Habovstiak <martin.habovstiak@gmail.com>2021-02-06 22:16:54 +0100
commit66f7f7d8a9e6e524468f5d84e73b438274c20dbb (patch)
tree5a40ced7d98859d21e752101f44284c102a0c162
parent399b6452b5d9982438be208668bc758479f13725 (diff)
downloadrust-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.rs30
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