2010-10-14 18 views
28

Comment puis-je utiliser boost::filesystem::path pour spécifier un chemin relatif sur Windows? Cette tentative échoue:boost :: chemin relatif du système de fichiers et répertoire courant?

boost:filesystem::path full_path("../asset/toolbox"); // invalid path or directory. 

Peut-être pour m'aider à déboguer, comment obtenir le répertoire de travail actuel avec boost :: filesystem?

+0

Juste pour clarifier, j'ai résolu mon problème. La méthode ci-dessus est correcte pour l'accès relatif au chemin. Cependant, dans MSVS le répertoire de travail actuel n'était pas ce que j'avais prévu. currentmot de hmuelner() a aidé. – Jake

Répondre

51
getcwd = boost::filesystem::path full_path(boost::filesystem::current_path()); 

Exemple:

boost::filesystem::path full_path(boost::filesystem::current_path()); 
std::cout << "Current path is : " << full_path << std::endl; 

Pour accéder current_path un besoin d'ajouter #include <boost/filesystem.hpp>.

+1

il semble y avoir un défaut ici, ce n'est pas une expression C++ valide, est-ce qu'il manque quelque chose entre boost :: filesystem :: path et full_path? – Sven

+1

Il ne s'agit pas d'une expression C++ valide, mais d'une notation abrégée pour la réponse. En C++ moderne, vous pouvez écrire: auto cwd = boost :: filesystem :: current_path(); – hmuelner

0

Lorsque vous tapez "../votre/path", ne spécifiez-vous pas un chemin de type unix? Je pense que ce que vous devez faire pour obtenir le système des chemins spécifiques est:

boost:filesystem::path full_path(".."/"asset"/"toolbox"); 

Dans ce cas, le «/» est un parcours concaténer opérateur d'une manière spécifique du système et ne fait pas partie du chemin que vous spécifiez.

+2

désolé mais, cela ne fonctionne pas? – Jake

+1

Pas vraiment ... Vous spécifiez un chemin dans le format interne boost :: filesystem, qui ressemble un peu à unix. J'aime aussi mieux la notation de l'opérateur. Vous auriez à faire quelque chose comme chemin chemin complet = chemin ("..")/"actif"/"boîte à outils"; –

+2

Et dans Windows, vous pouvez également utiliser '/' comme délimiteur de répertoire. –

2

Si vous souhaitez modifier le répertoire précédent essayez quelque chose comme ceci:

boost::filesystem::path full_path(boost::filesystem::current_path()); 
std::cout << "Current path is : " << full_path << std::endl; 

//system("cd ../"); // change to previous dir -- this is NOT working 
chdir("../"); // change to previous dir -- this IS working 

boost::filesystem::path new_full_path(boost::filesystem::current_path()); 
std::cout << "Current path is : " << new_full_path << std::endl; 
11

Essayez la fonction system_complete. Cela imite exactement la manière dont le système d'exploitation résout lui-même les chemins relatifs.