windows - 如何从规范的 Windows 路径中删除\\?\前缀?

标签 windows rust

在 Windows 上,Path::canonicalize() 以以下格式返回路径:

\\\\?\\C:\\projects\\3rdparty\\rust...

这是因为它是正确的规范路径,并且在 Windows 上允许“长”路径(参见 Why does my canonicalized path get prefixed with \\?\)。

但是,这不是一条用户友好的路径,人们不理解它。

为了显示和记录的目的,我怎样才能以一种通用的平台独立方式轻松地删除这个前缀?

Path::components 将返回组件 \\?\C: 作为第一个组件...

我应该将其转换为 &str 并使用正则表达式吗?是否有其他更符合人体工程学的方法来删除前缀,例如某些带有自动执行正确操作的Display 实现的类型?

我的具体要求是:

  • 正确显示 X:\\... 作为 Windows 上的规范路径。
  • 不会搞砸非 Windows 平台(例如剥离或更改路径组件)

例子:

use std::path::{Path, PathBuf};

fn simple_path<P: AsRef<Path>>(p: P) -> String {
    String::from(p.as_ref().to_str().unwrap()) // <-- ?? What to do here?
}

pub fn main() {
    let path = PathBuf::from("C:\temp").canonicalize().unwrap();
    let display_path = simple_path(path);
    println!("Output: {}", display_path);
}

最佳答案

使用the dunce crate :

extern crate dunce;
…
let compatible_path = dunce::canonicalize(&any_path);

只是剥离 \\?\ 可能会给出错误/无效的路径。 dunce crate 检查 UNC 路径是否兼容,并尽可能准确地转换路径。它通过所有其他路径。它在非 Windows 上编译为纯 fs::canonicalize()

关于windows - 如何从规范的 Windows 路径中删除\\?\前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50322817/

相关文章:

windows - 从 Windows 7 通过 USB 连接到 Orbbec Persee 时出现问题

rust - 生命周期问题和实现克隆

rust - Rust 宏在特征定义中起作用吗?

arrays - 如何打印数组和向量?

enums - 使用模式匹配参数的闭包组合 Option<Enum>

rust - 如何在 Rust 中创建可用作 Reader、Writer 或 Seek 的内存对象?

windows - 在 Windows 上将 headless (headless) Ubuntu 服务器安装到 VirtualBox

windows - Windows 7 中非常基本的 git 批处理

windows - 为什么应用程序会弹出错误, "Control doesn' t have parent window,“运行 3 周后?

java - 作为计划任务运行批处理文件的行为不正常?