Для создания каталога применяется функция std::fs::create_dir():
pub fn create_dir<P: AsRef<Path>>(path: P) -> Result<()>
В качестве параметра в функцию передается путь к создаваемому каталогу:
use std::fs;
fn main() -> Result<(), std::io::Error> {
fs::create_dir("test")?; // создаем папку test
Ok(())
}
В данном случае в текущем каталоге создается папка "test".
Однако, что если нам надо создать подкаталог в еще не существующем каталоге, например:
use std::fs;
fn main() -> Result<(), std::io::Error> {
fs::create_dir("hello/test")?; // создаем папку test
Ok(())
}
Здесь мы пытаемся создать папку test в каталоге "hello", который должен находиться в текущей папке. Если в текущей папке каталоге "hello" не существует, то мы столкнемся с ошибкой. И для решения этой проблемы для создания всего дерева каталогов Rust предоставляет аналогичную функцию create_dir_all():
use std::fs;
fn main() -> Result<(), std::io::Error> {
fs::create_dir_all("hello/test")?; // создаем папку hello/test
Ok(())
}
Если папка уже существует, ото при вызове функции fs::create_dir() мы столкнемся с ошибкой. Чтобы этого не произошло, мы можем заранее проверять существование искомой папки:
use std::fs;
use std::path:: Path;
fn main() -> Result<(), std::io::Error> {
let dir_path = "test"; // название создаваемой папки
// если папка не существует
if !Path::new(dir_path).exists() {
fs::create_dir(dir_path)?; // создаем папку
}
Ok(())
}
Для удаление папки применяется функция fs::remove_dir(), в которую передается путь к удаляемой папке:
use std::fs;
fn main() -> Result<(), std::io::Error> {
fs::remove_dir("test")?; // удаляем папку test
Ok(())
}
С помощью функции fs::read_dir() можно прочитать содержимое папки. В качестве параметра передается путь к считываемой папке, а результатом функции является структура ReadDir, которая и содержит набор элементов папки в виде объектов структуры DirEntry:
use std::fs;
fn main() -> Result<(), std::io::Error> {
let dir = fs::read_dir(".")?; // читаем текущий каталог
for entry in dir {
let entry = entry?;
let path = entry.path();
print!("{:?} -\t", path.file_name().unwrap_or_default());
let file_type = entry.file_type()?;
let file_type_str =
if file_type.is_file() { "File" }
else if file_type.is_dir() { "Directory" }
else { "Unknown" };
println!("{}", file_type_str);
}
Ok(())
}
В данном случае в функцию передается путь ".", который представляет текущий каталог. И в моем случае вывод будет следующим:
"main" - File "example.txt" - File "main.rs" - File "hello" - Directory "test" - Directory "example2.txt" - File "hello.txt" - File