1 个不稳定版本
0.1.0 | 2022 年 3 月 7 日 |
---|
#778 在 文件系统
7,984 每月下载次数
在 25 个 Crates 中使用 (9 直接使用)
20KB
199 行
resolve-path
一个用于在 Rust 中解析相对(./
)和波浪线路径(~/
)的 crate。
注意,此功能不会执行 路径规范化,即它不会消除路径中的 ..
或 ./././
段。此 crate 的目的是简单地使相对路径有一个从根开始的绝对路径。
动机
Rust 标准库中有 Path
和 PathBuf
用于处理文件路径,但遗憾的是,没有简单且直观的方法来以以下方式解析相对路径
- 相对于进程当前工作目录 (CWD)
- 相对于活动用户的家目录(
~/
) - 相对于用户提供的绝对路径
API
此 crate 提供了一个扩展 trait PathResolveExt
,其中包含路径类型扩展方法。以下方法提供:
resolve
和 try_resolve
这些方法将解析相对于进程当前工作目录的相对路径(./...
),并将波浪线路径(~/...
)解析为活动用户的家目录。
假设家目录为 /home/user
且当前工作目录为 /home/user/Documents
,则 resolve
方法将按以下方式评估
use std::path::Path;
use resolve_path::PathResolveExt;
// Direct variant (may panic)
assert_eq!("~/.vimrc".resolve(), Path::new("/home/user/.vimrc"));
assert_eq!("./notes.txt".resolve(), Path::new("/home/user/Documents/notes.txt"));
// Try variant (returns Result)
assert_eq!("~/.vimrc".try_resolve().unwrap(), Path::new("/home/user/.vimrc"));
assert_eq!("./notes.txt".try_resolve().unwrap(), Path::new("/home/user/Documents/notes.txt"));
resolve_in
和 try_resolve_in
这些方法将以正常方式解析波浪线路径(~/...
),但会根据提供的基目录解析相对路径(./...
)。这在某些情况下非常有用,例如,在根据配置文件的位置而不是当前工作目录的位置评估配置文件中给出的路径时。
假设家目录为 /home/user
且当前工作目录为 /home/user/Documents
,则 resolve_in
方法将按以下方式评估:
use std::path::Path;
use resolve_path::PathResolveExt;
// Direct variant (may panic)
assert_eq!("~/.vimrc".resolve_in("~/.config/alacritty/"), Path::new("/home/user/.vimrc"));
assert_eq!("./alacritty.yml".resolve_in("~/.config/alacritty/"), Path::new("/home/user/.config/alacritty/alacritty.yml"));
// Try variant (returns Result)
assert_eq!("~/.vimrc".try_resolve_in("~/.config/alacritty/").unwrap(), Path::new("/home/user/.vimrc"));
assert_eq!("./alacritty.yml".try_resolve_in("~/.config/alacritty/").unwrap(), Path::new("/home/user/.config/alacritty/alacritty.yml"));
为什么使用 Cow<Path>
?
如果在实际上不需要解析的路径上调用任何 PathResolveExt
方法(即已经绝对路径的路径),则解析器方法将简单地返回包含原始路径引用的 Cow::Borrowed(&Path)
。如果确实发生解析,则路径将以某种方式被编辑(例如,添加绝对路径前缀),并以 Cow::Owned(PathBuf)
返回。这样我们就可以避免不必要的分配。
依赖项
~57–510KB