2010-11-14 8 views
103

Hola tengo actualmente un programa que recibe una ruta completa de la ubicación de un archivo y se pone en una variable que es el tipo de: impulso :: :: filesystem2 rutaCómo convertir el tipo de ruta boost a string?

he mirado cómo hacer esto y tienen encontrado que el uso de:

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

convertirá el camino hacia la cadena, pero sólo convierte el nombre del archivo (por ejemplo, si la ruta es "C: \ nombre \ bobsAwesomeWordDoc.docx" simplemente devuelve "bobsAwesomeWordDoc").

He encontrado lo siguiente sobre cómo convertir la ruta completa a cadena, pero no sé cómo implementarlo en mi programa. Lo he intentado de varias maneras, pero obtengo errores de conversión.

const std :: string & cadena(): Esta rutina devuelve una copia de la cadena con la que se ha inicializado el camino, con el formato de acuerdo con las reglas de la gramática ruta.

(encontrado here)

que he intentado:

string result1 = string& (myPath); 

y algunas otras variaciones.

Respuesta

120

Solo necesita llamar al myPath.string().

+0

¿Hay garantías de que la cadena devuelva la ruta de acceso utf8 en todas las plataformas? –

+0

@SergeyShambir: Desafortunadamente no. Uno puede usar explícitamente 'u8string()', pero eso no ayuda donde 'string()' se usa automáticamente. –

9

yo creo que hay que hacer un poco más que convertir el trazado a una cadena - primero debe obtener la versión canónica de la ruta - una ruta absoluta, sin elementos simbólico-Link - y convertir que en una Cadena:

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

PS - He estado programando con Boost durante años y no pude encontrar fácilmente esta información en los documentos.


Actualización (octubre 2017)

Documentación: boost::filesystem::canonical.

Pero tenga en cuenta que a partir de C++ 17 hay std::filesystem, con canonical y mucho más.

+0

La respuesta aceptada es una alternativa mucho más simple (y funciona) – alestanis

+5

Canonical solo funciona si el archivo existe –

+4

canonical está en desuso en las versiones más nuevas de Boost http://www.boost.org/doc/libs/1_48_0/libs/filesystem /v3/doc/deprecated.html –

3

Esto funcionó en wxWidgets: (Sé que debería sólo tiene que utilizar los servicios públicos wx pero es una prueba)

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

Calling myPath.generic_string() hará lo que usted necesita.

+0

Esto devuelve lo mismo que la respuesta aceptada – smac89

Cuestiones relacionadas