我有一个
&Path
,我需要在第一个冒号处将最终组件文件名分成两部分。
我可以得到最终的组件作为
&OsStr
(path.file_name()
) - 但后来我有点坚持实际对内容做任何事情。 文档给了我一些选择:
to_str()
或 to_string_lossy()
,如果不是 UTF-8,则失败或返回损坏的字符串(无法保证!)to_bytes()
或 to_cstring()
,但自 Rust 1.6 起它们被标记为已弃用。impl OsStrExt
和 as_bytes()
方法。 OsStrExt
是 std::os::unix::ffi::OsStrExt
,被描述为“OsStr
的 Unix 特定扩展”。然而 std::os::unix 显然是“Unix 平台上 std 的实验性扩展。”我错过了更多标准吗?
碰巧我很高兴将此应用程序限制在 Unix 上,所以
OsStrExt::as_bytes
看起来是目前最好的选择;但它真的还是实验性的吗,还是文档已经过时了?
没有处理文件系统路径的标准方法,因为并非所有平台在路径的表示和有效性方面都有相同的规则。
在基于 Unix 的系统(Linux、Mac OS X 等)上,路径是不能包含空字节的字节序列 (
u8
)。 std::os::unix
模块可在这些平台上使用。尽管该模块的描述说是“实验性的”,但大部分都是稳定的,因此稳定的功能保证在未来的 Rust 1.x 版本中仍然可用。
注意:自从问题和答案被写入后,模块的描述已被修改,并且不再被描述为实验性的。
在 Windows NT 上,路径是一系列 16 位字(通常解释为 UTF-16 代码单元),其中可能包含不成对的代理项。在内部,Rust 将这些路径转换为 WTF-8(这只是 UTF-8,另外还允许对不成对的代理进行编码,U+D800–U+DFFF)。
std::os::windows
模块在此平台上可用。它提供了 different OsStrExt
和 OsStringExt
特征,让您可以将 OsStr
编码为可能格式错误的 UTF-16 或将可能格式错误的 UTF-16 路径解码为 OsString
,但不要不提供对 WTF-8 表示的访问。