读取目录筛选MP4文件时遇临时值提前释放错误求助
解决DirEntry路径临时值悬空问题
错误根源
你遇到的问题是因为**DirEntry::path()每次调用都会生成一个新的PathBuf临时实例**。当你链式调用.extension()时,extension()返回的&OsStr引用绑定到这个临时PathBuf上——而临时值会在当前表达式执行完毕后立即被销毁,导致后续的.to_str()引用了已释放的对象,触发编译器生命周期错误。
而.path().metadata()不会报错,是因为metadata()仅临时借用Path引用完成操作,不会持有引用到表达式结束之后,生命周期是安全的。
修复代码
你已经提前把e.path()赋值给了变量,直接复用这个变量就能解决问题,同时优化错误处理避免不必要的panic:
use std::fs; fn main() { let folder = "./your-target-folder"; // 替换为目标文件夹路径 let paths = fs::read_dir(&folder).unwrap(); for path in paths { match path { Ok(e) => { let full_path = e.path(); // 优雅处理扩展名获取的各种可能情况 if let Some(extension) = full_path.extension().and_then(|ext| ext.to_str()) { if extension.eq_ignore_ascii_case("mp4") { println!("找到MP4文件: {}", full_path.display()); } } } Err(err) => eprintln!("读取目录项失败: {}", err), } } }
关键说明
- 复用局部变量
full_path:这个变量的生命周期覆盖后续扩展名操作,引用不会悬空。 - 优化错误处理:用
and_then和if let处理Option,避免因无扩展名或非UTF-8路径直接崩溃。 - 大小写不敏感匹配:实际场景中MP4扩展名可能有
.mp4/.MP4等,eq_ignore_ascii_case更贴合需求。
内容的提问来源于stack exchange,提问作者swissdwarf
相关产品推荐
相关产品推荐

