如何将PathBuf转换为String

xia*_*oai 21 rust

我必须将PathBuf变量转换为a String来提供我的函数.我的代码是这样的:

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

它有效,但很糟糕cwd.as_os_str….您是否有更方便的方法或任何有关如何处理它的建议?

mca*_*ton 15

故意不容易:String是UTF-8编码,但PathBuf可能不是(例如在Windows上).因此转换可能会失败.

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

  • 非常感谢。@lukas kalbertodt,关于Cow的使用,可以参考这个博客:http://hermanradtke.com/2015/05/29/creating-a-rust-function-that-returns-string-or-str.html (3认同)

Par*_*rai 13

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

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

  • 根据文档,“.as_path()”方法不是必需的:“它还实现了“Deref”到“Path”,这意味着“Path”切片上的所有方法也可用于“PathBuf”值。 (4认同)
  • 我一直在用这个,因为它很方便。你知道它内部是否使用了 to_string_lossy() 吗?否则,我想知道它如何进行转换而不返回任何可能的错误? (2认同)

Mic*_*ico 11

正如mcarton所说的那样并非如此简单,并非所有路径都是UTF-8编码的.但你可以使用:

p.into_os_string().into_string()
Run Code Online (Sandbox Code Playgroud)

要对它进行精细控制.通过?您可以发送错误上一级或简单地忽略它的unwrap():

let my_str = cwd.into_os_string().into_string().unwrap();
Run Code Online (Sandbox Code Playgroud)

美丽的事情into_string()是错误包装原始OsString值.


ypw*_*ang 6

正如@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)
Run Code Online (Sandbox Code Playgroud)

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