Файловая система

Работа с каталогами

Последнее обновление: 19.05.2024

Создание каталога

Для создания каталога применяется функция 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
Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850