如何在特定字符处拆分 &Path 的最后一个组成部分?

问题描述 投票:0回答:1

我有一个

&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
看起来是目前最好的选择;但它真的还是实验性的吗,还是文档已经过时了?

rust filenames
1个回答
3
投票

没有处理文件系统路径的标准方法,因为并非所有平台在路径的表示和有效性方面都有相同的规则。

在基于 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 表示的访问。

© www.soinside.com 2019 - 2024. All rights reserved.