async_std/fs/metadata.rs
1use crate::io;
2use crate::path::Path;
3use crate::task::spawn_blocking;
4
5/// Reads metadata for a path.
6///
7/// This function will traverse symbolic links to read metadata for the target file or directory.
8/// If you want to read metadata without following symbolic links, use [`symlink_metadata`]
9/// instead.
10///
11/// This function is an async version of [`std::fs::metadata`].
12///
13/// [`symlink_metadata`]: fn.symlink_metadata.html
14/// [`std::fs::metadata`]: https://doc.rust-lang.org/std/fs/fn.metadata.html
15///
16/// # Errors
17///
18/// An error will be returned in the following situations:
19///
20/// * `path` does not point to an existing file or directory.
21/// * The current process lacks permissions to read metadata for the path.
22/// * Some other I/O error occurred.
23///
24/// # Examples
25///
26/// ```no_run
27/// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
28/// #
29/// use async_std::fs;
30///
31/// let perm = fs::metadata("a.txt").await?.permissions();
32/// #
33/// # Ok(()) }) }
34/// ```
35pub async fn metadata<P: AsRef<Path>>(path: P) -> io::Result<Metadata> {
36 let path = path.as_ref().to_owned();
37 spawn_blocking(move || std::fs::metadata(path)).await
38}
39
40cfg_not_docs! {
41 pub use std::fs::Metadata;
42}
43
44cfg_docs! {
45 use std::time::SystemTime;
46
47 use crate::fs::{FileType, Permissions};
48
49 /// Metadata for a file or directory.
50 ///
51 /// Metadata is returned by [`metadata`] and [`symlink_metadata`].
52 ///
53 /// This type is a re-export of [`std::fs::Metadata`].
54 ///
55 /// [`metadata`]: fn.metadata.html
56 /// [`symlink_metadata`]: fn.symlink_metadata.html
57 /// [`is_dir`]: #method.is_dir
58 /// [`is_file`]: #method.is_file
59 /// [`std::fs::Metadata`]: https://doc.rust-lang.org/std/fs/struct.Metadata.html
60 #[derive(Clone, Debug)]
61 pub struct Metadata {
62 _private: (),
63 }
64
65 impl Metadata {
66 /// Returns the file type from this metadata.
67 ///
68 /// # Examples
69 ///
70 /// ```no_run
71 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
72 /// #
73 /// use async_std::fs;
74 ///
75 /// let metadata = fs::metadata("a.txt").await?;
76 /// println!("{:?}", metadata.file_type());
77 /// #
78 /// # Ok(()) }) }
79 /// ```
80 pub fn file_type(&self) -> FileType {
81 unreachable!("this impl only appears in the rendered docs")
82 }
83
84 /// Returns `true` if this metadata is for a regular directory.
85 ///
86 /// If this metadata is for a symbolic link, this method returns `false`.
87 ///
88 /// # Examples
89 ///
90 /// ```no_run
91 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
92 /// #
93 /// use async_std::fs;
94 ///
95 /// let metadata = fs::metadata(".").await?;
96 /// println!("{:?}", metadata.is_dir());
97 /// #
98 /// # Ok(()) }) }
99 /// ```
100 pub fn is_dir(&self) -> bool {
101 unreachable!("this impl only appears in the rendered docs")
102 }
103
104 /// Returns `true` if this metadata is for a regular file.
105 ///
106 /// If this metadata is for a symbolic link, this method returns `false`.
107 ///
108 /// # Examples
109 ///
110 /// ```no_run
111 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
112 /// #
113 /// use async_std::fs;
114 ///
115 /// let metadata = fs::metadata("a.txt").await?;
116 /// println!("{:?}", metadata.is_file());
117 /// #
118 /// # Ok(()) }) }
119 /// ```
120 pub fn is_file(&self) -> bool {
121 unreachable!("this impl only appears in the rendered docs")
122 }
123
124 /// Returns the file size in bytes.
125 ///
126 /// # Examples
127 ///
128 /// ```no_run
129 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
130 /// #
131 /// use async_std::fs;
132 ///
133 /// let metadata = fs::metadata("a.txt").await?;
134 /// println!("{}", metadata.len());
135 /// #
136 /// # Ok(()) }) }
137 /// ```
138 pub fn len(&self) -> u64 {
139 unreachable!("this impl only appears in the rendered docs")
140 }
141
142 /// Returns the permissions from this metadata.
143 ///
144 /// # Examples
145 ///
146 /// ```no_run
147 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
148 /// #
149 /// use async_std::fs;
150 ///
151 /// let metadata = fs::metadata("a.txt").await?;
152 /// println!("{:?}", metadata.permissions());
153 /// #
154 /// # Ok(()) }) }
155 /// ```
156 pub fn permissions(&self) -> Permissions {
157 unreachable!("this impl only appears in the rendered docs")
158 }
159
160 /// Returns the last modification time.
161 ///
162 /// # Errors
163 ///
164 /// This data may not be available on all platforms, in which case an error will be
165 /// returned.
166 ///
167 /// # Examples
168 ///
169 /// ```no_run
170 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
171 /// #
172 /// use async_std::fs;
173 ///
174 /// let metadata = fs::metadata("a.txt").await?;
175 /// println!("{:?}", metadata.modified());
176 /// #
177 /// # Ok(()) }) }
178 /// ```
179 pub fn modified(&self) -> io::Result<SystemTime> {
180 unreachable!("this impl only appears in the rendered docs")
181 }
182
183 /// Returns the last access time.
184 ///
185 /// # Errors
186 ///
187 /// This data may not be available on all platforms, in which case an error will be
188 /// returned.
189 ///
190 /// # Examples
191 ///
192 /// ```no_run
193 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
194 /// #
195 /// use async_std::fs;
196 ///
197 /// let metadata = fs::metadata("a.txt").await?;
198 /// println!("{:?}", metadata.accessed());
199 /// #
200 /// # Ok(()) }) }
201 /// ```
202 pub fn accessed(&self) -> io::Result<SystemTime> {
203 unreachable!("this impl only appears in the rendered docs")
204 }
205
206 /// Returns the creation time.
207 ///
208 /// # Errors
209 ///
210 /// This data may not be available on all platforms, in which case an error will be
211 /// returned.
212 ///
213 /// # Examples
214 ///
215 /// ```no_run
216 /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
217 /// #
218 /// use async_std::fs;
219 ///
220 /// let metadata = fs::metadata("a.txt").await?;
221 /// println!("{:?}", metadata.created());
222 /// #
223 /// # Ok(()) }) }
224 /// ```
225 pub fn created(&self) -> io::Result<SystemTime> {
226 unreachable!("this impl only appears in the rendered docs")
227 }
228 }
229}