Jak przekonwertować typ ścieżki doładowania na ciąg?

127

Witam Obecnie mam program, który pobiera pełną ścieżkę do lokalizacji pliku i jest umieszczany w zmiennej typu: boost :: filesystem2 :: path

Sprawdziłem, jak to zrobić i stwierdziłem, że za pomocą:

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

przekonwertuje ścieżkę na łańcuch, ALE konwertuje tylko nazwę pliku (np. jeśli ścieżka to „C: \ name \ bobsAwesomeWordDoc.docx”, zwraca po prostu „bobsAwesomeWordDoc”).

Znalazłem następujące informacje, jak przekonwertować całą ścieżkę na ciąg, ale nie wiem, jak zaimplementować to w moim programie. Próbowałem na wiele sposobów, ale otrzymuję błędy konwersji.

const std :: string & string (): Ta funkcja zwraca kopię ciągu, którym została zainicjowana ścieżka, z formatowaniem zgodnym z regułami gramatyki ścieżki.

(znalezione tutaj )

Próbowałem:

string result1 = string& (myPath);

i kilka innych odmian.

Johnston
źródło

Odpowiedzi:

164

Wystarczy zadzwonić myPath.string().

przestępczość lodowa
źródło
1
Czy istnieją gwarancje, że ciąg znaków zwraca ścieżkę zakodowaną w formacie utf8 na wszystkich platformach?
Sergey Shambir
1
@SergeyShambir: Niestety nie. Można jawnie użyć u8string(), ale to nie pomaga, gdy string()jest używane automatycznie.
Pozdrawiam i hth. - Alf
13

Wierzę, że trzeba zrobić coś więcej niż tylko przekonwertować ścieżkę do łańcucha - należy najpierw uzyskać kanoniczną wersję ścieżki - ścieżki bezwzględnej bez elementów symboliczno-Link - i przekształcić to w ciąg:

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

PS - programowałem w Boost od lat i nie mogłem łatwo znaleźć tych informacji w dokumentacji.


Aktualizacja (październik 2017 r.)

Dokumentacja: boost :: filesystem :: canonical .

Ale zauważ, że od C ++ 17 istnieje std :: filesystem , z kanonicznym i dużo więcej.

zrezygnowany
źródło
Przyjęta odpowiedź jest znacznie prostszą alternatywą (i działa)
alestanis
4
canonical jest przestarzałe w nowszych wersjach Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/ ...
Brian Jack
1
@BrianJack huh, dlaczego jest przestarzały? Sry, nie mogę znaleźć żadnej oficjalnej notatki ... zobacz także odniesienie 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc/ ...
Marco Alka
@MarcoAlka Zobacz połączoną tabelę boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/ ... i zwróć uwagę na drugą linię: class path () Funkcja usunięta - oznacza to, że była kiedyś w bibliotece, ale już nie - definicja przestarzałego.
Brian Jack,
2
@BrianJack To jest canonizeprzestarzałe, po drugim łączu, ale canonicalwydaje się , że takie nie jest (na twoje pierwsze łącze, dla 1_48 V3). Teraz w C ++ 17 mamy std::filesystemoczywiście
zdim
3

To działało w wxWidgets: (wiem, że powinienem po prostu użyć narzędzi wx, ale jest to 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
źródło
1

Dzwonienie myPath.generic_string()zrobi to, czego potrzebujesz.

J.Adler
źródło
0

Zrób to

path.c_str();

Powinno być dobrze.

Kaloryzowany
źródło