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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:45:03