You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中vec.push未添加元素:目录遍历函数无法返回路径

问题分析与解决

你的代码存在两个核心问题,导致无法返回所有文件和目录:

  1. 未收集文件路径:当前代码仅在遇到目录时将路径存入paths,文件分支完全没有添加操作,返回集合自然不包含文件。
  2. 递归结果未合并:调用iter_dirs(&path)时,只是执行了递归函数但没有将其返回的子目录/文件路径合并到当前集合,子目录下的所有内容都丢失了。

修正后的代码

use std::fs;
use std::path::{Path, PathBuf};

fn iter_dirs(path: &Path) -> Vec<PathBuf> {
    let mut paths = vec![];
    for entry in fs::read_dir(path).unwrap() {
        let entry = entry.unwrap();
        let path = entry.path();
        if path.is_dir() {
            println!("Found a dir : {:?}", entry.display());
            // 添加当前目录路径到结果集合
            paths.push(path.clone());
            // 递归遍历子目录,合并返回的路径
            let sub_paths = iter_dirs(&path);
            paths.extend(sub_paths);
        } else {
            println!("Found a file : {:?}", entry);
            // 添加文件路径到结果集合
            paths.push(path);
        }
    }
    paths
}

关键修改说明

  • 收集文件路径:在文件分支的else块中加入paths.push(path);,将文件路径存入结果集合。
  • 合并递归结果:调用递归函数后,用paths.extend(sub_paths);把子目录遍历得到的所有路径合并到当前集合中。
  • (可选)错误处理优化:实际项目中建议避免直接用unwrap(),可以将函数改为返回Result类型处理错误,示例如下:
    fn iter_dirs(path: &Path) -> Result<Vec<PathBuf>, Box<dyn std::error::Error>> {
        let mut paths = vec![];
        for entry in fs::read_dir(path)? {
            let entry = entry?;
            let path = entry.path();
            if path.is_dir() {
                println!("Found a dir : {:?}", entry.display());
                paths.push(path.clone());
                let sub_paths = iter_dirs(&path)?;
                paths.extend(sub_paths);
            } else {
                println!("Found a file : {:?}", entry);
                paths.push(path);
            }
        }
        Ok(paths)
    }
    

内容的提问来源于stack exchange,提问作者ayush mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:22:33