路径看起来是字符串,行为却和字符串不同:join 一个绝对路径会发生什么?点开头的文件有扩展名吗?路径一定是 UTF-8 吗?.. 会被自动折叠吗?这篇逐条验证。
编译:成功
运行(退出码 0):
"/home/u/docs/report.final.pdf" parent=Some("/home/u/docs") file_name=Some("report.final.pdf") stem=Some("report.final") ext=Some("pdf")
"notes.tar.gz" parent=Some("") file_name=Some("notes.tar.gz") stem=Some("notes.tar") ext=Some("gz")
".bashrc" parent=Some("") file_name=Some(".bashrc") stem=Some(".bashrc") ext=None
"dir/" parent=Some("") file_name=Some("dir") stem=Some("dir") ext=None
"/" parent=None file_name=None stem=None ext=None
"a/b/.." parent=Some("a/b") file_name=None stem=None ext=None
components("a//b/./c/../d"): ["Normal(\"a\")", "Normal(\"b\")", "Normal(\"c\")", "ParentDir", "Normal(\"d\")"]文件读写见std::fs 文件读写;跨平台差异见跨平台路径差异。
编译:成功
运行(退出码 0):
/data/app.join("x/y.txt") = "/data/app/x/y.txt"
/data/app.join("/etc/passwd") = "/etc/passwd"(拼接绝对路径,前缀被丢掉)
/data/app.join("../secret") = "/data/app/../secret"(.. 原样保留,不会被规范化)
PathBuf::push 连续 push("a") 与 push("/b") = "/b"
with_extension("md"): "a/b.md" with_extension(""): "a/b" with_file_name("z"): "a/z"
"a.tar.gz".extension() = Some("gz")(只取最后一段),file_stem = Some("a.tar") 编译:成功
运行(退出码 0):
"/a/b".starts_with("/a") = true "/ab".starts_with("/a") = false(按组件,/ab 不是 /a 的子路径)
"/a//b/" == "/a/b" = true "/a/./b" == "/a/b" = true "/a/c/../b" == "/a/b" = false
strip_prefix("/a"):Ok("b/c") strip_prefix("/x"):Err("prefix not found")
"foo.txt".ends_with("txt") = false(按组件:txt 不是整个文件名) ends_with("foo.txt") = true 编译:成功
运行(退出码 0):
构造路径本身没问题。文件名字节:[98, 97, 100, 95, 255, 254, 95, 110, 97, 109, 101, 46, 116, 120, 116]
to_str() = None(不是合法 UTF-8,所以是 None)
to_string_lossy() 的文件名部分 = "bad_��_name.txt"(非法字节被替换成 U+FFFD)
对照:合法 UTF-8 路径 to_str() = Some("ascii.txt")
在这个文件系统上创建该文件失败:Illegal byte sequence (os error 92)(kind = Uncategorized)Windows 路径使用 UTF-16 的 OsStr,本文没有验证。
编译:成功
运行(退出码 0):
未规范化:link/sub/../sub
canonicalize 之后相对 d:real/sub(.. 被折叠、符号链接被解析成 real)
不存在的路径 canonicalize: Err(NotFound)
is_absolute: true / false