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

Rust中迭代对象无法多次访问的问题解决咨询

Rust中正确遍历目录并复用DirEntry的方法

你的问题核心是所有权规则导致的:fs::read_dir返回的迭代器元素是Result<DirEntry>,每次调用d.unwrap()都会把这个Result对象消耗掉(Rust的移动语义),所以第一次if分支用了之后,else if里的d已经不存在了,自然编译报错。

正确的做法是先把Result解包一次,把DirEntry存到变量里,之后复用这个变量,而不是多次unwrap同一个Result。

修复后的基础版本

use std::fs;

fn main() {
    for entry_result in fs::read_dir("./").unwrap() {
        // 先解包一次,把DirEntry存到entry变量里
        let entry = entry_result.unwrap();
        let path = entry.path();
        
        if path.is_dir() {
            println!("目录: {:?}", path);
        } else if path.is_file() {
            println!("文件: {:?}", path);
        }
    }
}

更严谨的错误处理版本(不推荐随便unwrap)

实际项目里最好不要直接用unwrap(),应该处理读取目录或条目失败的情况:

use std::fs;
use std::io;

fn main() -> io::Result<()> {
    for entry_result in fs::read_dir("./")? {
        let entry = entry_result?;
        let path = entry.path();
        
        if path.is_dir() {
            println!("目录: {:?}", path);
        } else if path.is_file() {
            println!("文件: {:?}", path);
        }
    }
    Ok(())
}

额外补充:path.is_dir()和path.is_file()覆盖了常见的文件/目录场景,但系统中还存在符号链接、管道等特殊文件,若需要处理这类情况,可以添加else分支做对应逻辑。

内容的提问来源于stack exchange,提问作者Alexey Mirano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:25:27