Rust如何实现路径展开、路径拼接及glob文件匹配?
实现方案
依赖配置
先在Cargo.toml中添加依赖:
[dependencies] glob = "0.3" shellexpand = "3.1"
完整可运行代码
use std::path::PathBuf; use glob::glob; fn main() { // 展开波浪号路径,Cow<str>直接转换为String let output_path = shellexpand::tilde("~/Documents").into_owned(); // 路径拼接,自动处理跨平台分隔符 let pattern_path = PathBuf::from(output_path) .join("*") .join("**") .join("*.txt"); // 转换为glob需要的&str类型,处理非UTF-8路径场景 let pattern = pattern_path.to_str().expect("路径包含非法UTF-8字符"); // 遍历glob匹配结果 for entry in glob(pattern).expect("glob模式解析失败") { match entry { Ok(path) => println!("{}", path.display()), Err(e) => eprintln!("匹配出错:{}", e), } } }
原代码问题说明
- 标准库
fs::canonicalize不支持shell风格的波浪号扩展,该功能属于shell特性,标准库没有内置实现,使用shellexpand::tilde是正确方案。shellexpand::tilde返回的Cow<'_, str>类型可以直接通过into_owned()拿到String,或者as_ref()转成&str使用,无需复杂转换。 - 路径拼接推荐使用
PathBuf的join方法,自动处理跨平台路径分隔符,不需要手动构造数组补空串来保留前导斜杠,更符合Rust惯用写法。 PathBuf转&str只需要调用to_str()方法,因为系统路径可能存在非UTF-8字符,所以返回Option<&str>,普通场景下直接用expect处理即可,也可以根据业务需求添加自定义错误逻辑。
内容的提问来源于stack exchange,提问作者Edward J. Stembler
相关产品推荐
相关产品推荐

