如何基于指定目录规范化包含当前目录(.)的文件路径?
解决Rust中基于指定目录规范化相对路径的问题
std::fs::canonicalize会依赖实际文件系统,当目标文件不存在时就会报错。如果只是需要纯字符串层面的路径规范化(不需要文件实际存在),可以用Path和PathBuf的组件遍历功能来实现:
实现代码
use std::path::{Path, PathBuf}; fn normalize_path(base_dir: &str, relative_path: &str) -> PathBuf { // 拼接基础目录和相对路径 let mut path = Path::new(base_dir).join(relative_path); let mut components = path.components().peekable(); let mut normalized = PathBuf::new(); while let Some(component) = components.next() { match component { // 跳过当前目录标识"." std::path::Component::CurDir => {} // 处理上级目录标识"..",若当前规范化路径非空则回退一级 std::path::Component::ParentDir => { if !normalized.as_os_str().is_empty() { normalized.pop(); } } // 保留根目录、前缀和普通目录/文件名组件 std::path::Component::RootDir | std::path::Component::Prefix(_) | std::path::Component::Normal(_) => { normalized.push(component); } } } normalized } fn main() { let file_path = "./abcd.txt"; let cur_dir = "/a/b/c"; let normalized_path = normalize_path(cur_dir, file_path); println!("{}", normalized_path.display()); }
代码说明
- 首先将指定的基础目录与相对路径拼接成一个
PathBuf - 遍历路径的各个组件,手动处理特殊标识:
- 跳过
CurDir(即.) - 遇到
ParentDir(即..)时,若规范化后的路径非空则弹出最后一个组件(回退一级目录) - 其他正常组件(根目录、前缀、普通文件名/目录名)直接加入规范化路径
- 跳过
- 最终返回的
PathBuf就是符合预期的规范化绝对路径
测试结果
运行上述代码,输出为:
/a/b/c/abcd.txt
完全符合需求,且不需要依赖实际存在的文件。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

