2010-11-14 4 views
103

Bonjour J'ai actuellement un programme qui obtient un chemin complet de l'emplacement d'un fichier et est mis dans une variable qui est le type de: boost :: filesystem2 :: pathComment convertir le type de chemin boost en chaîne?

J'ai cherché comment faire cela et avoir constaté que l'utilisation:

string result1 = boost::filesystem::basename (myPath) 

convertit le chemin de chaîne, mais il ne convertit que le nom du fichier (par exemple, si le chemin est « C: \ nom \ bobsAwesomeWordDoc.docx » il retourne juste « bobsAwesomeWordDoc »).

J'ai trouvé ce qui suit sur la façon de convertir le chemin entier en chaîne, mais je ne sais pas comment l'implémenter dans mon programme. J'ai essayé plusieurs façons mais j'ai des erreurs de conversion.

const std :: string &(): Cette routine renvoie une copie de la chaîne avec laquelle le chemin a été initialisé, avec la mise en forme par les règles de grammaire chemin.

(trouvé here)

J'ai essayé:

string result1 = string& (myPath); 

et quelques autres variations.

Répondre

120

Vous avez juste besoin d'appeler myPath.string().

+0

Y a-t-il des garanties que la chaîne renvoie le chemin codé utf8 sur toutes les plateformes? –

+0

@SergeyShambir: Malheureusement non. On peut explicitement utiliser 'u8string()', mais cela n'aide pas où 'string()' est utilisé automatiquement. –

9

Je crois que vous devez faire un peu plus que juste convertir le chemin vers une chaîne - vous devez d'abord obtenir la version canonique du chemin - un chemin absolu sans éléments symboliques-link - et convertir qui en chaîne:

boost::filesystem::canonical(myPath).string(); 

PS - J'ai programmé avec Boost depuis longtemps et je ne pouvais pas facilement trouver cette information dans les docs.


Mise à jour (octobre 2017)

Documentation: boost::filesystem::canonical.

Mais notez que depuis C++ 17 il y a std::filesystem, avec canonical et beaucoup plus.

+0

La réponse acceptée est une alternative beaucoup plus simple (et cela fonctionne) – alestanis

+5

Canonical ne fonctionne que si le fichier existe –

+4

canonical est obsolète dans les nouvelles versions de Boost http://www.boost.org/doc/libs/1_48_0/libs/filesystem /v3/doc/deprecated.html –

3

Cela a fonctionné dans wxWidgets: (Je sais que je devrais utiliser les utilitaires WX mais il est un test)

void WxWidgetsBoostTestFrame::OnTestBtnClick(wxCommandEvent& event) 
{ 
    boost::filesystem::path currentPath; 
    currentPath = boost::filesystem::current_path(); 
    std::string curDirString; 
    curDirString = boost::filesystem::canonical(currentPath).string(); 
    wxString mystring(curDirString.c_str(), wxConvUTF8); 
    wxMessageBox(mystring); // output: C:/Users\client\Desktop...  
} 
1

Appel myPath.generic_string() fera ce que vous avez besoin.

+0

Cela renvoie la même chose que la réponse acceptée – smac89

Questions connexes