rust递归遍历磁盘目录及文件

//遍历dir目录,找出修改日期距离当前超过age天的文件名称,存入file_list中
fn visit_dir(dir: &Path, file_list: &mut Vec, age: u64) -> io::Result<()> {
    if dir.is_dir() {
        for entry in fs::read_dir(dir)? {
            let entry = entry?;
            let path = entry.path();
            if path.is_dir() {
                visit_dir(&path, file_list, age)?;
            } else {
                let file_matedata = fs::metadata(entry.path()).unwrap();
                let modify_time = file_matedata.modified()?;
                if modify_time + Duration::from_secs(age * 24 * 60 * 60) < SystemTime::now(){
                    file_list.push(entry.path().to_str().unwrap().to_string());
                }
            }
        }
    }
    Ok(())
}

//遍历dir目录,找出空目录(内部无文件,无目录)
fn get_empty_dir(dir: &Path, dir_list: &mut Vec) -> io::Result<()>{
    if !dir.is_dir() {
        return Ok(());
    }
    let read_dir = fs::read_dir(dir)?;
    let cnt = read_dir.count();
    if cnt == 0 {
        dir_list.push(dir.to_str().unwrap().to_owned());
        return Ok(());
    }

    let read_dir = fs::read_dir(dir)?;
    for entry in read_dir{
        let entry = entry?;
        let path = entry.path();
        if path.is_dir() {
            get_empty_dir(path.as_path(), dir_list)?;
        }
    }
    Ok(())
}

上述函数实现比较直接,需要注意fs::read_dir()函数返回值后面的?宏,从read_dir返回值中提取结果。如visit_dir、get_empty_dir函数定义返回值不是io::Result类型,使用?宏,会报错。因为?宏还涉及错误传播,需要io::Result参与。

你可能感兴趣的:(rust,linux,开发语言)