Как преобразовать тип ускоренного пути в строку?


128

Здравствуйте, у меня сейчас есть программа, которая получает полный путь к местоположению файла и помещается в переменную типа: boost :: filesystem2 :: path

Я посмотрел, как это сделать, и обнаружил, что используя:

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

преобразует путь в строку, НО преобразует только имя файла (например, если путь - «C: \ name \ bobsAwesomeWordDoc.docx», он просто возвращает «bobsAwesomeWordDoc»).

Я нашел следующее о том, как преобразовать весь путь в строку, но я не знаю, как реализовать это в моей программе. Я пробовал несколько способов, но получаю ошибки конвертации.

const std :: string & string (): эта процедура возвращает копию строки, которой был инициализирован путь, с форматированием в соответствии с правилами грамматики пути.

(найдено здесь )

Я пытался:

string result1 = string& (myPath);

и несколько других вариантов.

Ответы:


165

Вам просто нужно позвонить myPath.string().


1
Есть ли гарантии, что строка возвращает путь в кодировке utf8 на всех платформах?
Сергей Шамбир

1
@SergeyShambir: К сожалению, нет. Можно использовать явно u8string(), но это не помогает там, где string()используется автоматически.
Приветствия и hth. - Alf

13

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

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

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


Обновление (октябрь 2017 г.)

Документация: boost :: filesystem :: canonical .

Но обратите внимание, что с C ++ 17 есть std :: filesystem с каноническим и многим другим.


Принятый ответ - гораздо более простая альтернатива (и она работает)
алестанис

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.