清除和重用Rust PathBuf的跨平台方法是什么?

Ten*_*ken 6 rust

为了在处理大量文件系统路径时尽可能降低开销,我想避免为每个路径分配内存.有没有办法清理和重用PathBuf

从我在文档中找到的内容来看,PathBuf当通过PathBuf::push(至少在POSIX系统上)处理绝对路径时,重用a 是可能的,但是PathBuf在处理相对路径时我还没有找到重用a的方法.

有没有办法以跨平台的方式做到这一点,还是我被迫以平台特定的方式处理这些路径?

mca*_*ton 6

一种方法是将PathBuf其转换为内部存储,清除它,然后将其转换回PathBuf.这不需要额外的分配:

use std::path::PathBuf;

fn main() {
    let path = PathBuf::from("../tmp");
    let mut path = path.into_os_string();
    path.clear();
    let mut path = PathBuf::from(path);
    path.push("../etc");
    assert_eq!(path, PathBuf::from("../etc"));
}
Run Code Online (Sandbox Code Playgroud)

(游乐场的固定链接)

  • 没有太多要验证的.在Linux上,路径中唯一不允许的字符是NUL,但是`OsString`必须是NUL终止的,因此第一个NUL被解释为路径的结尾.对于`/`,允许任何序列,并删除重复`/// foo // bar ////`有效且与`/ foo/bar /`相同(唯一的例外是两个前导斜杠是为POSIX定义的实现,但我不知道任何系统仍然使用不同的那些). (3认同)