Skip to main content

rustpython_host_env/
fs.rs

1use std::{
2    fs::{self, File, Metadata, ReadDir},
3    io,
4    path::{Path, PathBuf},
5};
6
7mod append_log;
8pub use append_log::AppendLog;
9
10pub fn open(path: impl AsRef<Path>) -> io::Result<File> {
11    File::open(path)
12}
13
14pub fn read(path: impl AsRef<Path>) -> io::Result<Vec<u8>> {
15    fs::read(path)
16}
17
18pub fn read_to_string(path: impl AsRef<Path>) -> io::Result<String> {
19    fs::read_to_string(path)
20}
21
22pub fn read_dir(path: impl AsRef<Path>) -> io::Result<ReadDir> {
23    fs::read_dir(path)
24}
25
26pub fn create_dir_all(path: impl AsRef<Path>) -> io::Result<()> {
27    fs::create_dir_all(path)
28}
29
30pub fn remove_dir(path: impl AsRef<Path>) -> io::Result<()> {
31    fs::remove_dir(path)
32}
33
34pub fn remove_file(path: impl AsRef<Path>) -> io::Result<()> {
35    fs::remove_file(path)
36}
37
38pub fn metadata(path: impl AsRef<Path>) -> io::Result<Metadata> {
39    fs::metadata(path)
40}
41
42pub fn exists(path: impl AsRef<Path>) -> bool {
43    metadata(path).is_ok()
44}
45
46pub fn is_file(path: impl AsRef<Path>) -> bool {
47    metadata(path).is_ok_and(|metadata| metadata.is_file())
48}
49
50pub fn is_dir(path: impl AsRef<Path>) -> bool {
51    metadata(path).is_ok_and(|metadata| metadata.is_dir())
52}
53
54pub fn symlink_metadata(path: impl AsRef<Path>) -> io::Result<Metadata> {
55    fs::symlink_metadata(path)
56}
57
58pub fn open_write(path: impl AsRef<Path>) -> io::Result<File> {
59    fs::OpenOptions::new().write(true).open(path)
60}
61
62pub fn canonicalize(path: impl AsRef<Path>) -> io::Result<PathBuf> {
63    fs::canonicalize(path)
64}
65
66/// Resolve `binary_name` to an absolute path by searching `PATH` (and `PATHEXT` on Windows).
67#[cfg(not(target_arch = "wasm32"))]
68pub fn which<T: AsRef<std::ffi::OsStr>>(binary_name: T) -> Option<PathBuf> {
69    ::which::which(binary_name).ok()
70}
71
72#[cfg(windows)]
73pub fn open_write_with_custom_flags(path: impl AsRef<Path>, flags: u32) -> io::Result<File> {
74    use std::os::windows::fs::OpenOptionsExt;
75
76    fs::OpenOptions::new()
77        .write(true)
78        .custom_flags(flags)
79        .open(path)
80}