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.

Odpowiedzi:



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.


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...      
}


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.