1 个不稳定发布
| 0.1.0-alpha.0 | 2023 年 4 月 1 日 |
|---|
#998 in 文件系统
46KB
703 行
X-Path
⚠️ 警告
这是一个正在进行中的工作,尚未准备就绪
使用案例
配置文件
以下路径在任何平台上都是有效的。它们将在加载时被清理并解析环境变量。
dir1 = "~/mydir/${SOME_ENV}/../"
dir2 = "c:\\anotherdir\\%ANOTHER_ENV%"
明确期望
使用以下之一来传达您的函数或 API 期望的内容。
| 任何 | 目录 | 文件 | |
|---|---|---|---|
| 任何 | [AnyPath] | [DirPath] | [FilePath] |
| 相对 | [RelPath] | [RelDirPath] | [RelFilePath] |
| 绝对 | [AbsPath] | [AbsDirPath] | [AbsFilePath] |
fn mirror(file: RelFilePath, from: AbsDirPath, to: AbsDirPath) {}
可测试
#[test]
fn test() -> anyhow::Result<()> {
// imagine that the path string is read from a conf.toml file:
let dir = AbsDirPath::new(r"~/dir1//..\dir2");
// when using the alternative debug specifier, if the path starts
// with current working directory or user home, then they are replaced
// with '.' or '~' respectively. The path separator used is always '/'.
assert_eq!(format!("{:#?}", dir), "AbsDirPath(~/dir2)");
// standard debug output uses the internal representation of the path
// which uses the full path with platform specific path separators.
// linux:
assert_eq!(format!("{:?}", dir), "AbsDirPath(/home/me/code/dir2)");
// windows:
assert_eq!(format!("{:?}", dir), r"AbsDirPath(c:\Users\me\code\dir2)");
}
跨平台
所有平台都可以使用 Windows 风格和 Unix 风格的路径。它们都将被解析并转换为可比较的统一格式。
读取时强制执行典型的文件系统限制。在 Windows 上,应用了 NTFS、VFAT 和 exFAT 限制,这些限制比 Unix 更严格。如果要在 Unix 上运行时应用相同的限制,请启用功能 strict。
方便
作为 &str 访问路径,所有路径都实现了
- 显示 以便于显示。
AsRef<Path>以与所有 std::fs 操作进行互操作性。- 使用
path.segments()将路径段作为&strings 遍历。 - 许多方便的功能:请参阅每个路径类型的文档。
设计目标
- 让 rust 的典型 "if it compiles it works" 体验也能适用于跨平台路径处理。
- 使路径可比较,即它们在内存中解析为通用格式,并在使用时转换为特定平台的格式。
- 使用跨平台兼容的路径(尽可能)来编写配置文件。
- AnyPath 适用于通用情况,而特定路径则用于确保兼容性。
- 提供区分绝对路径或相对路径、目录或文件的类型。
- FilePath, FileAbsPath, FileRelPath
- DirPath, DirAbsPath, DirAbsPath
- 支持主要操作系统和文件系统。
- Linux & Unix:大多数文件系统。
- macOS:HFS+,APFS。
- Windows:exFAT,NTFS。启用
strict功能。
- 可比较的路径(因为它们被解析,见下面的路径比较)。
非目标
- 最大性能。
- 疯狂的文件名。即仅支持 UTF-8 文件名。
其他
- 显示解析后的路径或使用
.native_string()或format("{path:#}")输出 OS 本地字符串。 - 错误
- 处理使用 anyhow 旨在产生全面且易于阅读的消息,而不是可解析的消息。
- 消息总是包括相关的路径。
- 消息包括相对路径的当前工作目录。
限制
在创建和操作路径时验证限制。默认情况下,在基于 Unix 的平台上,只应用少数限制。在 Windows 上,有更多的自动限制。
如果您想确保路径在所有平台上无缝工作(尽可能),则启用 strict Cargo 功能。
字符
保留字符
- 斜杠(
/和\):在所有平台上用作路径分隔符。 $和%:如果位于路径的开头或紧接斜杠之后,将解释为环境变量,见环境变量部分。.和~:如果位于路径的开头,后跟斜杠或无字符,则分别解释为当前工作目录和用户主目录。
始终禁止
在 strict 模式下或运行在 Windows 上时禁止
- Ascii 控制字符:0x00-0x1F,0x7F
",*,/,<,>,?,\,|- 文件名:CON,PRN,AUX,NUL,COM0 - COM9 和 LPT0 - LPT9。以及这些文件名后的任何扩展名(例如:.txt)。
路径分隔符(斜杠)和驱动器
路径分隔符保留在内存中,并以平台本机表示形式显示,即使用二进制文件运行的平台。对于 Windows,它是 \,对于其他平台,它是 /。
在 Windows 上,任何驱动器字母都保持小写,在其他平台上则被丢弃。
这意味着以 c:\my\path 或 /my/path 编写的字符串将被转换并存储在内存中,并按以下方式显示:
- Windows:当当前目录的驱动器字母为
c时,为c:\my\path - 其他平台:为
/my/path
路径组件
路径组件限制为最多 255 个字符。
文件名
在严格模式或Windows平台上运行时禁止:CON、PRN、AUX、NUL、COM0 - COM9 和 LPT0 - LPT9。还包括这些文件名加上扩展名(例如:.txt)。
路径解析
路径解析不涉及文件系统访问,因此路径不需要存在。
| 路径* | 变为 | 当 | 是 | 注释 |
|---|---|---|---|---|
., ./ |
nix: /tmpwin: c:\tmp |
current_dir() | nix: /tmpwin: c:\tmp |
|
~, ~/ |
nix: /Users/tomwin: c:\Users\tom |
home_dir() | nix: /Users/tomwin: c:\Users\tom |
|
/ |
nix: /win: c:\ |
- current_dir() |
- win: c:/ |
- win: 同当前目录的驱动器 |
c:/,C:/ |
nix: /win: c:\ |
nix: 驱动器字母被移除 win: 驱动器字母总是小写 |
||
c:dir |
nix: /tmp/dirwin: c:\tmp\dir |
current_dir() | nix: /tmpwin: c:\tmp |
|
dir//dir |
nix: dir/dirwin: dir\dir |
多个斜杠会被连接 | ||
dir/./dir |
nix: dir/dirwin: dir\dir |
路径中的点会被忽略 | ||
dir/.. |
空路径 | |||
dir1/dir2/.. |
dir1 |
|||
${MYDIR},%MYDIR% |
dir |
var("MYDIR") | dir |
见环境变量 |
说明
- * - 任何
/也可以是\。 - nix - 基于Unix的平台:Linux、Unix、macOS。
- win - Windows
- current_dir() - 指的是rust的std::env::current_dir()
- var() - 指的是rust的std::env::var(key)
- home_dir() - 指的是dirs_sys::home_dir()
环境变量
对于环境变量有有限的支撑,其中只有以Unix风格开始的路径段:以${开头并以}结尾,或者在Windows风格中以%开头和结尾的路径段会被解释为环境变量并在读取时展开。比通常更严格的限制减少了与正常路径的干扰。
解释为环境变量
/dir/${MYVAR}/、${MYVAR}、${MYVAR}/dir、/dir/${MYVAR}/dir/%MYVAR%/、%MYVAR%、%MYVAR%/dir、/dir/%MYVAR%
不被解释为环境变量
$MYVAR- 缺少大括号hi${MYVAR,${MYVARhi,hi%MYVAR%,%MYVAR%hi- 前后不是斜杠的任何字符。${MYVAR,%MYVAR- 未关闭。${MY-VAR},%MY-VAR%:不允许在环境变量中使用该字符。
返回错误
${},\${},\${}\- 空键是无效的%MYVAR当环境变量 MYVAR 未定义时。
路径比较
在内存中保持路径时,路径保留大小写,比较是大小写不敏感的。
参考
依赖项
~0.1–13MB
~99K SLoC