web-dev-qa-db-fra.com

Obtenir un chemin absolu avec boost :: filesystem :: path

Mon répertoire de travail actuel est situé à /home/myuser/program, j'ai créé un objet boost::filesystem::path qui le pointait. J'ai ajouté /../somedir pour qu'il devienne /home/myuser/program/../somedir. Mais je dois obtenir son chemin absolu résolu, qui serait /home/myuser/somedir.

J'essaie depuis longtemps et je ne trouve aucune méthode dans leur référence pour le faire. Il existe une méthode appelée make_absolute, qui semble être supposée fonctionner comme prévu, mais je dois lui donner un argument de chemin «racine». Que devrait-il être? Ai-je vraiment besoin de faire cela pour obtenir le vrai chemin absolu? Y-a t'il une autre possibilité?

27
Mario

Vous dites que vous voulez un chemin absolu, mais votre exemple montre que vous avez déjà un chemin absolu. Le processus de suppression des composants .. d'un chemin est appelé canonicalization. Pour cela, vous devez appeler canonical . Il se trouve que vous exécutez également la tâche absolute; vous n'avez donc pas besoin d'appeler absolute ou make_absolute en premier. La fonction make_absolute nécessite un chemin de base; vous pouvez le passer current_path() si vous n’avez rien de mieux.

23
Rob Kennedy

Mise à jour, car cela semble toujours être le hit de Google concernant les chemins absolus: 

Depuis Boost 1.57, certaines des fonctions précédemment suggérées ont été supprimées.

La solution qui a fonctionné pour moi était

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo);

(en utilisant la méthode autonome canonical () , définie dans boost/filesystem/operations.hpp, qui est automatiquement incluse via boost/filesystem.hpp)

Important: appeler canonical sur un chemin inexistant (par exemple, vous voulez créer un fichier) lève une exception. Dans ce cas, votre prochain meilleur pari est probablement boost :: filesystem :: absolute (). Cela fonctionnera également pour les chemins Non existants, mais ne supprimera pas les points au milieu du chemin (comme dans a/b/c /../../ d.txt) . Remarque: Assurez-vous que relativeTo fait référence à un répertoire, en appelant parent_path () sur les chemins faisant référence à des fichiers (par exemple, le fichier ouvert contenant un répertoire ou un chemin d'accès relatif à lui-même).

11
Daniel

Je dois lui donner un argument de chemin «racine».

Vérifiez la documentation: vous n'avez n'avez pas à donner quoi que ce soit; il a un second paramètre par défaut. À savoir, le répertoire actuel.

Les chemins relatifs sont relatifs à un répertoire. Ainsi, pour rendre un chemin absolu, vous devez savoir en quoi il doit être absolu par rapport à. C'est le "chemin racine": le répertoire auquel il est relatif.

0
Nicol Bolas