Rust中vec.push未添加元素:目录遍历函数无法返回路径
问题分析与解决
你的代码存在两个核心问题,导致无法返回所有文件和目录:
- 未收集文件路径:当前代码仅在遇到目录时将路径存入
paths,文件分支完全没有添加操作,返回集合自然不包含文件。 - 递归结果未合并:调用
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
相关产品推荐
相关产品推荐

