Rust中将文件名转换为URI的等效实现方法是什么?
Rust 文件名转URI等效实现方法
Rust 实现该功能的方式和其他语言逻辑基本一致,分为普通路径转换和带用户目录(~)路径转换两种场景:
普通绝对路径转换
自 Rust 1.65 版本起,标准库 std::path::Path 提供了稳定的 to_file_uri() 方法,可直接完成转换,无需引入第三方依赖:
use std::path::Path; fn main() { // 等效于 Python 的 pathlib.Path("/hello/world").as_uri() / C 的 g_filename_to_uri let file_uri = Path::new("/hello/world").to_file_uri().unwrap(); println!("{}", file_uri); // 输出:file:///hello/world }
to_file_uri() 会返回 Result 类型,当传入的路径不是绝对路径、或包含当前平台不合法的路径字符时会返回错误,实际使用时需根据场景做错误处理。
如果使用的 Rust 版本低于 1.65,可以使用第三方 url crate 实现相同功能:
- 先在 Cargo.toml 中添加依赖:
url = "2.4" - 代码示例:
use std::path::Path; use url::Url; fn main() { let file_uri = Url::from_file_path(Path::new("/hello/world")).unwrap(); println!("{}", file_uri); }
带~的用户目录路径转换
Rust 标准库没有内置展开用户目录~的能力,需要借助第三方 dirs crate 先完成路径展开再转URI:
- 先在 Cargo.toml 中添加依赖:
dirs = "5.0" - 代码示例:
use std::path::{Path, PathBuf}; use dirs::home_dir; // 等效于 Python 的 expanduser() 方法 fn expand_user_path(path: &str) -> Option<PathBuf> { if !path.starts_with('~') { return Some(Path::new(path).to_path_buf()); } let mut home = home_dir()?; home.push(path.strip_prefix("~/").unwrap_or_default()); Some(home) } fn main() { let expanded_path = expand_user_path("~/hello/world").unwrap(); let file_uri = expanded_path.to_file_uri().unwrap(); println!("{}", file_uri); // 输出类似 file:///home/你的用户名/hello/world }
内容的提问来源于stack exchange,提问作者arunanshub
相关产品推荐
相关产品推荐

