Comment convertir le type de chemin boost en chaîne?

127

Bonjour J'ai actuellement un programme qui obtient un chemin complet de l'emplacement d'un fichier et qui est placé dans une variable du type: boost :: filesystem2 :: path

J'ai cherché comment faire cela et j'ai trouvé cela en utilisant:

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

convertira le chemin en chaîne MAIS il ne convertit que le nom du fichier (par exemple, si le chemin est "C: \ name \ bobsAwesomeWordDoc.docx", il renvoie simplement "bobsAwesomeWordDoc").

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

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

(trouvé ici )

J'ai essayé:

string result1 = string& (myPath);

et quelques autres variantes.

Johnston
la source

Réponses:

164

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

la glace
la source
1
Existe-t-il des garanties que la chaîne renvoie le chemin encodé en utf8 sur toutes les plates-formes?
Sergey Shambir
1
@SergeyShambir: Malheureusement non. On peut explicitement utiliser u8string(), mais cela n'aide pas où string()est utilisé automatiquement.
Bravo et hth. - Alf
13

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ément symbolique de liaison - et convertir que dans une chaîne:

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

PS - Je programme avec Boost depuis des lustres et je n'ai pas pu trouver facilement cette information dans la documentation.


Mise à jour (octobre 2017)

Documentation: boost :: filesystem :: canonical .

Mais notez qu'à partir de C ++ 17, il existe std :: filesystem , avec canonical et bien plus encore.

résigné
la source
La réponse acceptée est une alternative beaucoup plus simple (et cela fonctionne)
alestanis
4
canonical est obsolète dans les nouvelles versions de Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack
1
@BrianJack hein, comment est-il obsolète? Sry, ne trouve aucune note officielle ... voir aussi la référence 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc
Marco Alka
@MarcoAlka Voir la table liée boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… et notez la deuxième ligne: class path canonize () Fonction supprimée - cela signifie qu'il était une fois dans la bibliothèque mais plus - la définition de obsolète.
Brian Jack
2
@BrianJack C'est le canonizequi est obsolète, par votre deuxième lien, mais canonicalne semble pas l'être (par votre premier lien, pour 1_48 V3). Maintenant en C ++ 17, nous avons std::filesystembien sûr
zdim
3

Cela a fonctionné dans wxWidgets: (je sais que je devrais simplement utiliser les utilitaires wx mais c'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...      
}
Paddy
la source
1

L'appel myPath.generic_string()fera ce dont vous avez besoin.

J.Adler
la source
0

Faire ça

path.c_str();

Vous devriez aller bien.

Calorifié
la source