Як перетворити тип шляху підвищення в рядок?


127

Привіт В даний час у мене є програма, яка отримує повний шлях до розташування файлу і вводиться в змінну, яка є типом: boost :: filesystem2 :: path

Я роздивився, як це зробити, і виявив, що використовуючи:

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

перетворить шлях у рядок, Але він перетворює лише ім'я файлу (наприклад, якщо шлях "C: \ name \ bobsAwesomeWordDoc.docx", він просто повертає "bobsAwesomeWordDoc").

Я знайшов наступне про те, як перетворити весь шлях у рядок, але не знаю, як його реалізувати у своїй програмі. Я спробував кілька способів, але отримую помилки конверсії.

const std :: string & string (): Ця процедура повертає копію рядка, з яким був ініціалізований шлях, з форматуванням за правилами граматики шляху.

(знайдено тут )

Я намагався:

string result1 = string& (myPath);

та кілька інших варіацій.

Відповіді:


164

Вам просто потрібно зателефонувати myPath.string().


1
Чи є гарантії, що рядок повертає закодований шлях utf8 на всіх платформах?
Сергій Шамбір

1
@SergeyShambir: На жаль, ні. Можна явно використовувати u8string(), але це не допомагає, де string()використовується автоматично.
Ура та хт. - Альф

13

Я вважаю , що вам потрібно зробити трохи більше , ніж просто перетворити шлях в рядок - ви повинні спочатку отримати канонічну версію шляху - абсолютний шлях без будь - яких елементів символічної лінії зв'язку - і новонавернений , що в рядок:

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

PS - Я програмував Boost протягом століть, і я не міг легко знайти цю інформацію в документах.


Оновлення (жовтень 2017)

Документація: boost :: файлова система :: canonical .

Але зауважте, що на C ++ 17 існує std :: файлова система з канонічною та багато іншого.


Прийнята відповідь набагато простіша альтернатива (і це працює)
алестаніс

4
canonical застаріло в новіших версіях Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Брайан Джек

1
@BrianJack так, як це застаріло? Шрі, не можу знайти жодної офіційної записки ... див. Також 1.60 посилання: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Марко Алька

@MarcoAlka Дивіться пов’язану таблицю boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… та зверніть увагу на другий рядок: шлях до класу canonize () Функція видалена - це означає, що вона була колись у бібліотеці, але більше не була --визначення застарілого.
Брайан Джек

2
@BrianJack Це canonizeзастаріле, за вашим другим посиланням, але canonical, схоже, не є (за першим посиланням, для 1_48 V3). Зараз у C ++ 17 у нас std::filesystemзвичайно
zdim

3

Це працювало в wxWidgets: (Я знаю, що я повинен просто використовувати утиліти wx, але це тест)

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.