Обход дерева папок в 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";
Скажите, где в обходе вызывается та же функция снова.
Добавьте в обход счетчик файлов и выведите итог.