Wie konvertiere ich den Boost-Pfad-Typ in einen String?

127

Hallo, ich habe derzeit ein Programm, das einen vollständigen Pfad des Speicherorts einer Datei abruft und in eine Variable eingefügt wird, die den Typ: boost :: filesystem2 :: path hat

Ich habe nachgeschlagen, wie das geht, und festgestellt, dass mit:

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

konvertiert den Pfad in eine Zeichenfolge, konvertiert jedoch nur den Dateinamen (z. B. wenn der Pfad "C: \ name \ bobsAwesomeWordDoc.docx" lautet, wird nur "bobsAwesomeWordDoc" zurückgegeben).

Ich habe Folgendes zum Konvertieren des gesamten Pfads in einen String gefunden, weiß jedoch nicht, wie ich ihn in meinem Programm implementieren soll. Ich habe mehrere Möglichkeiten ausprobiert, erhalte jedoch Konvertierungsfehler.

const std :: string & string (): Diese Routine gibt eine Kopie der Zeichenfolge zurück, mit der der Pfad initialisiert wurde, wobei die Formatierung gemäß den Pfadgrammatikregeln erfolgt.

( hier gefunden )

Ich habe versucht:

string result1 = string& (myPath);

und ein paar andere Variationen.

Johnston
quelle

Antworten:

164

Sie müssen nur anrufen myPath.string().

Eiskriminalität
quelle
1
Gibt es Garantien dafür, dass der String auf allen Plattformen den utf8-codierten Pfad zurückgibt?
Sergey Shambir
1
@ SergeyShambir: Leider nicht. Man kann explizit verwenden u8string(), aber das hilft nicht, wo string()automatisch verwendet wird.
Prost und hth. - Alf
13

Ich glaube, Sie müssen ein wenig mehr tun, als nur den Pfad in einen String umzuwandeln. Sie sollten zuerst die kanonische Version des Pfads erhalten - einen absoluten Pfad ohne symbolische Verknüpfungselemente - und diesen in einen String umwandeln :

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

PS: Ich programmiere seit Ewigkeiten mit Boost und konnte diese Informationen in den Dokumenten nicht leicht finden.


Update (Okt 2017)

Dokumentation: boost :: filesystem :: canonical .

Beachten Sie jedoch, dass es ab C ++ 17 std :: filesystem mit Canonical und vielem mehr gibt.

resigniert
quelle
Die akzeptierte Antwort ist eine viel einfachere Alternative (und es funktioniert)
Alestanis
4
Canonical
Brian Jack
1
@ BrianJack huh, wie ist es veraltet? Sry, kann keine offizielle Notiz finden ... siehe auch 1.60 Referenz: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka
@MarcoAlka Siehe die verknüpfte Tabelle boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… und beachten Sie die zweite Zeile: Klassenpfad canonize () Funktion entfernt - das heißt, sie war einmal in der Bibliothek, aber nicht mehr - die Definition von veraltet.
Brian Jack
2
@BrianJack Es ist das canonize, was gemäß Ihrem zweiten Link veraltet ist, aber canonicalnicht zu sein scheint (gemäß Ihrem ersten Link für 1_48 V3). Jetzt in C ++ 17 haben wir std::filesystemnatürlich
zdim
3

Dies funktionierte in wxWidgets: (Ich weiß, ich sollte nur die wx-Dienstprogramme verwenden, aber es ist ein 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
quelle
1

Anrufen myPath.generic_string()wird tun, was Sie brauchen.

J. Adler
quelle
0

Mach das

path.c_str();

Es sollte dir gut gehen.

Kalorifiziert
quelle