1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
//! Cross-platform path manipulation. //! //! This module is an async version of [`std::path`]. //! //! This module provides two types, [`PathBuf`] and [`Path`][`Path`] (akin to [`String`] //! and [`str`]), for working with paths abstractly. These types are thin wrappers //! around [`OsString`] and [`OsStr`] respectively, meaning that they work directly //! on strings according to the local platform's path syntax. //! //! Paths can be parsed into [`Component`]s by iterating over the structure //! returned by the [`components`] method on [`Path`]. [`Component`]s roughly //! correspond to the substrings between path separators (`/` or `\`). You can //! reconstruct an equivalent path from components with the [`push`] method on //! [`PathBuf`]; note that the paths may differ syntactically by the //! normalization described in the documentation for the [`components`] method. //! //! [`std::path`]: https://doc.rust-lang.org/std/path/index.html //! //! ## Simple usage //! //! Path manipulation includes both parsing components from slices and building //! new owned paths. //! //! To parse a path, you can create a [`Path`] slice from a [`str`] //! slice and start asking questions: //! //! ``` //! use async_std::path::Path; //! use std::ffi::OsStr; //! //! let path = Path::new("/tmp/foo/bar.txt"); //! //! let parent = path.parent(); //! assert_eq!(parent, Some(Path::new("/tmp/foo"))); //! //! let file_stem = path.file_stem(); //! assert_eq!(file_stem, Some(OsStr::new("bar"))); //! //! let extension = path.extension(); //! assert_eq!(extension, Some(OsStr::new("txt"))); //! ``` //! //! To build or modify paths, use [`PathBuf`]: //! //! ``` //! use async_std::path::PathBuf; //! //! // This way works... //! let mut path = PathBuf::from("c:\\"); //! //! path.push("windows"); //! path.push("system32"); //! //! path.set_extension("dll"); //! //! // ... but push is best used if you don't know everything up //! // front. If you do, this way is better: //! let path: PathBuf = ["c:\\", "windows", "system32.dll"].iter().collect(); //! ``` //! //! [`Component`]: enum.Component.html //! [`components`]: struct.Path.html#method.components //! [`PathBuf`]: struct.PathBuf.html //! [`Path`]: struct.Path.html //! [`push`]: struct.PathBuf.html#method.push //! [`String`]: https://doc.rust-lang.org/std/string/struct.String.html //! //! [`str`]: https://doc.rust-lang.org/std/primitive.str.html //! [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html //! [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html mod ancestors; mod components; mod iter; mod path; mod pathbuf; #[doc(inline)] pub use std::path::{ is_separator, Component, Display, Prefix, PrefixComponent, StripPrefixError, MAIN_SEPARATOR, }; pub use ancestors::Ancestors; pub use components::Components; pub use iter::Iter; pub use path::Path; pub use pathbuf::PathBuf;