Je dois convertir la variable PathBuf
en String
pour alimenter ma fonction. Mon code est comme ceci:
let cwd = env::current_dir().unwrap();
let my_str: String = cwd.as_os_str().to_str().unwrap().to_string();
println!("{:?}", my_str);
cela fonctionne mais est horrible avec le cwd.as_os_str…
. Avez-vous une méthode plus pratique ou des suggestions sur la façon de la gérer?
Ce n'est pas facile à dessein: String
sont encodés en UTF-8, mais PathBuf
peut ne pas l'être (par exemple sous Windows). La conversion peut donc échouer.
Il y a aussi to_str
et to_string_lossy
méthodes pour plus de commodité. Le premier retourne un Option<&str>
pour indiquer un échec possible et le dernier réussira toujours mais remplacera les caractères non UTF-8 par U+FFFD REPLACEMENT CHARACTER
(c'est pourquoi il renvoie Cow<str>
: si le chemin est déjà UTF-8 valide, il renverra une référence au tampon interne mais si certains caractères doivent être remplacés, il allouera un nouveau String
pour cela; dans les deux cas, vous pouvez alors utiliser into_owned
si vous avez vraiment besoin d'un String
).
Comme le dit déjà mcarton, ce n'est pas si simple et tous les chemins ne sont pas encodés en UTF-8. Mais vous pouvez utiliser:
p.into_os_string().into_string()
Pour en avoir un bon contrôle. Par ?
, Vous pouvez envoyer une erreur au niveau supérieur ou simplement l'ignorer par unwrap()
:
let my_str = cwd.into_os_string().into_string().unwrap();
La beauté de into_string()
est que l'erreur enveloppe la valeur d'origine OsString
.
Une façon de convertir PathBuf en chaîne serait:
your_path.as_path().display().to_string();