如何将PathBuf转换为String

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

我必须将

PathBuf
变量转换为
String
才能满足我的功能。我的代码是这样的:

let cwd = env::current_dir().unwrap();
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string();
println!("{:?}", my_str);

它可以工作,但与

cwd.as_os_str…
一起使用很糟糕。 您有更方便的方法或者有什么处理建议吗?

string rust directory path
5个回答
89
投票

正如 mcarton 所说,事情并不那么简单,因为并非所有路径都是 UTF-8 编码。但你可以使用:

p.into_os_string().into_string()

为了对其进行精细控制,请利用

?
将错误发送到上层,或者通过调用
unwrap()
:

忽略它
let my_str = cwd.into_os_string().into_string().unwrap();

关于

into_string()
的一个好处是错误会覆盖原始
OsString
值。


37
投票

故意这样做并不容易:

String
是UTF-8编码的,但
PathBuf
可能不是(例如在Windows上)。所以转换可能会失败。

为了方便,还有

to_str
to_string_lossy
方法。前者返回
Option<&str>
来指示可能的失败,后者始终会成功,但会用
U+FFFD REPLACEMENT CHARACTER
替换非 UTF-8 字符(这就是它返回
Cow<str>
的原因:如果路径已经是有效的 UTF-8,它将返回对内部缓冲区的引用,但如果要替换某些字符,它将为此分配一个新的
String
;在这两种情况下,如果您确实需要 into_owned
,则可以使用 
String
) .


28
投票

将 PathBuf 转换为 String 的一种方法是:

your_path.as_path().display().to_string();


4
投票

正如 @mcarton 提到的, to_string_lossy() 应该可以完成这项工作。

let cwd = env::current_dir().unwrap();
let path: String =String::from(cwd.to_string_lossy());

rustc 1.56.1 (59eed8a2a 2021-11-01)

我是一个(学习)Rust 粉丝(多年的 c/c++ 程序员)但是伙计,如果它让简单的事情变得如此复杂,UTF-8 和 COW.. 会让人们迷失在翻译中。


0
投票

最短的解决方案,还考虑了 Unicode 字符,这是 Windows 路径所必需的:

let my_str: String = cwd.display().to_string();

游乐场

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