Rust递归读取目录树
·
Rust遍历文件
【fs::read_dir】可以返回目录迭代器,有了这个,就可以遍历文件夹中的子路径了,测试如下
use std::fs;
let dirs: std::fs::ReadDir = std::fs::read_dir(".").expect("读取失败");
for entry in dirs {
let e = entry.expect("解析失败");
if e.file_type().expect("类型查询失败").is_file() {
println!("{}", e.file_name().to_string_lossy());
}
}
由于上述代码在evcxr中运行,无法根据上下文推断数据类型,所以在创建变量dir的时候,需要指明其类型。read_dir的返回值是【ReadDir】类型,这种类型并不会一次性读取目录,而是在每次调用next的时候读取一条。由于实现了Iterator,当通过in进行遍历时,会反复调用next,故而实现了当前路径的输出。
DirEntry
在遍历ReadDir的过程中,每次都会返回一个DirEntry结构,内部包含 4 4 4个方法
- path() 返回PathBuf类型的完整路径
- metadata() 返回Metadata类型的元数据
- file_type() 返回FileType类型的文件类别
- file_name() 返回字符串类型的文件名
测试如下
use std::fs;
let mut read_dir: std::fs::ReadDir = fs::read_dir(".")?;
if let Some(res) = read_dir.next(){
let ent = res?;
let full_path = ent.path(); // ① 完整路径 -> PathBuf
let file_name = ent.file_name(); // ② 仅文件名 -> OsString
let file_type = ent.file_type()?; // ③ 文件类型 -> FileType (带 ?)
let metadata = ent.metadata()?; // ④ 详细元数据 -> Metadata (带 ?)
println!("路径: {:?}", full_path);
println!("文件名: {:?}", file_name);
println!("是目录吗? {}", file_type.is_dir());
println!("文件大小: {} 字节", metadata.len());
}else {}
输出如下
路径: “.\test.txt”
文件名: “test.txt”
是目录吗? false
文件大小: 18 字节
()
递归读取路径
在通过read_dir进行路径读取时,只需判断读取到的条目是否为目录,即可实现递归读取路径,示例如下
use std::path::Path;
fn walk_dir_std(path: &Path) -> std::io::Result<()> {
for entry in fs::read_dir(path)? {
let entry = entry?;
let path = entry.path();
println!("{:?}", path);
if entry.file_type()?.is_dir() {
walk_dir_std(&path)?;
}
}
Ok(())
}
walk_dir_std(Path::new("."));
// ".\\test.txt
代码中,通过对walk_dir_std的递归调用,实现了对目录树的递归输出。其中is_dir为true时,表示当前路径为目录。
小结
本文介绍了Rust中遍历文件和目录的方法。通过fs::read_dir获取目录迭代器ReadDir,可以遍历文件夹内容。DirEntry结构体提供了获取路径、文件名、文件类型和元数据的方法。文章还展示了如何递归遍历目录树:通过判断文件类型是否为目录,递归调用遍历函数实现深度遍历。示例代码演示了基本文件遍历和递归目录遍历的实现方式,包括错误处理和路径信息获取。这些方法为Rust中的文件系统操作提供了基础支持。
更多推荐


所有评论(0)