Como converter o tipo de caminho de impulso em string?

127

Olá Atualmente, tenho um programa que obtém um caminho completo da localização de um arquivo e é colocado em uma variável do tipo: boost :: filesystem2 :: path

Eu procurei como fazer isso e descobri que usando:

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

irá converter o caminho para string, mas apenas converterá o nome do arquivo (por exemplo, se o caminho for "C: \ name \ bobsAwesomeWordDoc.docx", ele retornará "bobsAwesomeWordDoc").

Encontrei o seguinte sobre como converter o caminho inteiro em string, mas não sei como implementá-lo no meu programa. Eu tentei várias maneiras, mas estou recebendo erros de conversão.

const std :: string & string (): esta rotina retorna uma cópia da string com a qual o caminho foi inicializado, com formatação de acordo com as regras gramaticais do caminho.

(encontrado aqui )

Eu tentei:

string result1 = string& (myPath);

e algumas outras variações.

Johnston
fonte

Respostas:

164

Você só precisa ligar myPath.string().

icecrime
fonte
1
Existem garantias de que a string retorne o caminho codificado utf8 em todas as plataformas?
Sergey Shambir
1
@SergeyShambir: Infelizmente não. Pode-se usar explicitamente u8string(), mas isso não ajuda onde string()é usado automaticamente.
Saúde e hth. - Alf
13

Eu acredito que você precisa fazer um pouco mais do que apenas converter o caminho em uma string - você deve primeiro obter a versão canônica do caminho - um caminho absoluto sem elementos de link simbólico - e convertê- lo em uma string:

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

PS - Venho programando com o Boost há muito tempo e não consegui encontrar essas informações facilmente nos documentos.


Atualização (out 2017)

Documentação: boost :: filesystem :: canonical .

Mas observe que, a partir do C ++ 17, existe o sistema std :: files , com canonical e muito mais.

resignado
fonte
A resposta aceita é uma alternativa muito mais simples (e funciona)
alestanis
4
O canonical foi descontinuado nas versões mais recentes do Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack
1
@BrianJack huh, como é reprovado? Sry, não consigo encontrar nenhuma nota oficial ... consulte também a referência 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka
@MarcoAlka Veja a tabela vinculada boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/… e observe a segunda linha: caminho da classe canonize () Função removida - isso significa que já esteve na biblioteca, mas não está mais - a definição de obsoleto.
Brian Jack
2
@BrianJack É o canonizeque está obsoleto, por seu segundo link, mas canonicalnão parece estar (por seu primeiro link, para 1_48 V3). Agora, em C ++ 17, temos, é std::filesystemclaro,
zdim 05/10
3

Isso funcionou no wxWidgets: (eu sei que devo usar os utilitários wx, mas é um teste)

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
fonte
1

Ligar myPath.generic_string()fará o que você precisar.

J.Adler
fonte
0

Faça isso

path.c_str();

Você deveria ficar bem.

Calorificado
fonte