web-dev-qa-db-fra.com

Comment convertir le PathBuf en chaîne

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?

25
xiaoai

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).

19
mcarton

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.

15
Michele d'Amico

Une façon de convertir PathBuf en chaîne serait:

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

0
Paras Bhattrai