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 88 89 90 91 92 93 94 95 96 97 98
/* Copyright (c) [2023] [Syswonder Community]
* [Rukos] is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
//! [`std::fs`]-like high-level filesystem manipulation operations.
mod dir;
mod file;
pub use self::dir::{DirBuilder, DirEntry, ReadDir};
pub use self::file::{File, FileType, Metadata, OpenOptions, Permissions};
use alloc::{string::String, vec::Vec};
use axio::{self as io, prelude::*};
/// Returns an iterator over the entries within a directory.
pub fn read_dir(path: &str) -> io::Result<ReadDir> {
ReadDir::new(path)
}
/// Returns the canonical, absolute form of a path with all intermediate
/// components normalized.
pub fn canonicalize(path: &str) -> io::Result<String> {
crate::root::absolute_path(path)
}
/// Returns the current working directory as a [`String`].
pub fn current_dir() -> io::Result<String> {
crate::root::current_dir()
}
/// Changes the current working directory to the specified path.
pub fn set_current_dir(path: &str) -> io::Result<()> {
crate::root::set_current_dir(path)
}
/// Read the entire contents of a file into a bytes vector.
pub fn read(path: &str) -> io::Result<Vec<u8>> {
let mut file = File::open(path)?;
let size = file.metadata().map(|m| m.len()).unwrap_or(0);
let mut bytes = Vec::with_capacity(size as usize);
file.read_to_end(&mut bytes)?;
Ok(bytes)
}
/// Read the entire contents of a file into a string.
pub fn read_to_string(path: &str) -> io::Result<String> {
let mut file = File::open(path)?;
let size = file.metadata().map(|m| m.len()).unwrap_or(0);
let mut string = String::with_capacity(size as usize);
file.read_to_string(&mut string)?;
Ok(string)
}
/// Write a slice as the entire contents of a file.
pub fn write<C: AsRef<[u8]>>(path: &str, contents: C) -> io::Result<()> {
File::create(path)?.write_all(contents.as_ref())
}
/// Given a path, query the file system to get information about a file,
/// directory, etc.
pub fn metadata(path: &str) -> io::Result<Metadata> {
File::open(path)?.metadata()
}
/// Creates a new, empty directory at the provided path.
pub fn create_dir(path: &str) -> io::Result<()> {
DirBuilder::new().create(path)
}
/// Recursively create a directory and all of its parent components if they
/// are missing.
pub fn create_dir_all(path: &str) -> io::Result<()> {
DirBuilder::new().recursive(true).create(path)
}
/// Removes an empty directory.
pub fn remove_dir(path: &str) -> io::Result<()> {
crate::root::remove_dir(None, path)
}
/// Removes a file from the filesystem.
pub fn remove_file(path: &str) -> io::Result<()> {
crate::root::remove_file(None, path)
}
/// Rename a file or directory to a new name.
/// Delete the original file if `old` already exists.
///
/// This only works then the new path is in the same mounted fs.
pub fn rename(old: &str, new: &str) -> io::Result<()> {
crate::root::rename(old, new)
}