Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsPmFsWk 367 of 373 menu
◀ ▶

Обход дерева папок в Rust

Обход заходит в папку и в ее папки той же функцией. Для каждой записи смотрят метаданные: файл печатают или обрабатывают, каталог передают в тот же блок с новым путем. Рекурсия здесь естественна, если есть стоп на файлах и пустых ветках.

Выведем все пути под data:

use std::fs; use std::io; use std::path::Path; fn walk_dir(path: &Path) -> io::Result<()> { for entry in fs::read_dir(path)? { let item = entry?; let child = item.path(); let info = item.metadata()?; if info.is_dir() { walk_dir(&child)?; } else if info.is_file() { println!("{}", child.display()); } } Ok(()) } fn main() -> io::Result<()> { fs::create_dir_all("data/sub")?; fs::write("data/root.txt", "a")?; fs::write("data/sub/inner.txt", "b")?; walk_dir(Path::new("data"))?; Ok(()) }

Глубину можно не хранить, если достаточно полного пути из записи:

use std::fs; use std::io; use std::path::Path; fn walk_dir(path: &Path) -> io::Result<()> { if path.is_file() { println!("{}", path.display()); return Ok(()); } for entry in fs::read_dir(path)? { let item = entry?; walk_dir(&item.path())?; } Ok(()) }

Дан путь:

let path = "docs";

Соберите дерево с подпапкой и двумя файлами, обойдите рекурсией и выведите все файлы.

Дан путь:

let path = "data";

Скажите, где в обходе вызывается та же функция снова.

Добавьте в обход счетчик файлов и выведите итог.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить