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中的文件系统操作提供了基础支持。
请添加图片描述

更多推荐