#path #relative-path #cross-platform #directory #safe #warnings #ready

x-path

x-path 是一个针对安全的 Rust 路径的编译即工作解决方案,具有绝对路径/相对路径和文件/目录变体,以提供 API 安全性和跨平台支持

1 个不稳定发布

0.1.0-alpha.02023 年 4 月 1 日

#998 in 文件系统

MIT 许可证

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 功能。

字符

保留字符

  • 斜杠(/\):在所有平台上用作路径分隔符。
  • $%:如果位于路径的开头或紧接斜杠之后,将解释为环境变量,见环境变量部分。
  • .~:如果位于路径的开头,后跟斜杠或无字符,则分别解释为当前工作目录和用户主目录。

始终禁止

  • 非 UTF-8 字符(即不要使用 OsStrOsString
  • NULL,:

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: /tmp
win: c:\tmp
current_dir() nix: /tmp
win: c:\tmp
~, ~/ nix: /Users/tom
win: c:\Users\tom
home_dir() nix: /Users/tom
win: c:\Users\tom
/ nix: /
win: c:\
-
current_dir()
-
win: c:/
-
win: 同当前目录的驱动器
c:/C:/ nix: /
win: c:\
nix: 驱动器字母被移除
win: 驱动器字母总是小写
c:dir nix: /tmp/dir
win: c:\tmp\dir
current_dir() nix: /tmp
win: c:\tmp
dir//dir nix: dir/dir
win: dir\dir
多个斜杠会被连接
dir/./dir nix: dir/dir
win: dir\dir
路径中的点会被忽略
dir/.. 空路径
dir1/dir2/.. dir1
${MYDIR},
%MYDIR%
dir var("MYDIR") dir 环境变量

说明

环境变量

对于环境变量有有限的支撑,其中只有以Unix风格开始的路径段:以${开头并以}结尾,或者在Windows风格中以%开头和结尾的路径段会被解释为环境变量并在读取时展开。比通常更严格的限制减少了与正常路径的干扰。

解释为环境变量

  • /dir/${MYVAR}/${MYVAR}${MYVAR}/dir/dir/${MYVAR}
  • /dir/%MYVAR%/%MYVAR%%MYVAR%/dir/dir/%MYVAR%

不被解释为环境变量

  • $MYVAR - 缺少大括号
  • hi${MYVAR${MYVARhihi%MYVAR%%MYVAR%hi - 前后不是斜杠的任何字符。
  • ${MYVAR%MYVAR - 未关闭。
  • ${MY-VAR}%MY-VAR%:不允许在环境变量中使用该字符。

返回错误

  • ${}\${}\${}\ - 空键是无效的
  • %MYVAR 当环境变量 MYVAR 未定义时。

路径比较

在内存中保持路径时,路径保留大小写,比较是大小写不敏感的。

参考

依赖项

~0.1–13MB
~99K SLoC