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

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().

icecrime
источник
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...      
}
Пэдди
источник
1

Звонок myPath.generic_string()сделает то, что вам нужно.

J.Adler
источник
0

Сделай это

path.c_str();

Все должно быть в порядке.

Calorified
источник