我有一个&Path
,我需要在第一个冒号处将最终的组件文件名分成两部分。
我可以将最后一个组件作为&OsStr
(path.file_name()
) - 但后来我实际上对内容做了一些事情。 documentation给了我一些选择:
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
看起来像现在最好的选择;但它真的还在试验性,还是文件过时了?
答案 0 :(得分:2)
没有标准的方法来处理文件系统路径,因为并非所有平台都有关于路径表示和有效性的相同规则。
在基于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
模块可在此平台上使用;它没有在Rust的文档网站上显示,但是如果你在本地构建std
的文档,它应该在那里。 The source for this module is here.它提供different OsStrExt
and OsStringExt
traits,允许您将OsStr
编码为可能格式错误的UTF-16,或将可能格式错误的UTF-16路径解码为OsString
,但不提供对WTF-8表示的访问。