¿Cómo convertir el tipo de ruta de impulso a una cadena?

127

Hola, actualmente tengo un programa que obtiene una ruta completa de la ubicación de un archivo y se coloca en una variable que es el tipo de: boost :: filesystem2 :: path

He buscado cómo hacer esto y he encontrado que usando:

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

convertirá la ruta a la cadena PERO solo convierte el nombre del archivo (por ejemplo, si la ruta es "C: \ name \ 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. He intentado varias formas, pero recibo errores de conversión.

const std :: string & string (): esta rutina devuelve una copia de la cadena con la que se inicializó la ruta, con formato según las reglas de gramática de la ruta.

(encontrado aquí )

Yo he tratado:

string result1 = string& (myPath);

y algunas otras variaciones.

Johnston
fuente

Respuestas:

164

Solo necesitas llamar myPath.string().

crimen de hielo
fuente
1
¿Hay garantías de que la cadena devuelve la ruta codificada utf8 en todas las plataformas?
Sergey Shambir
1
@SergeyShambir: Lamentablemente no. Se puede usar explícitamente u8string(), pero eso no ayuda cuando string()se usa automáticamente.
Saludos y hth. - Alf
13

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

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


Actualización (oct 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.

renunciar
fuente
La respuesta aceptada es una alternativa mucho más simple (y funciona)
alestanis
44
canonical está en desuso en las versiones más recientes de Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack
1
@BrianJack eh, ¿cómo está en desuso? Sry, no puedo encontrar ninguna nota oficial ... ver también 1.60 referencia: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka
@MarcoAlka Ver la tabla vinculada boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/... y anote la segunda línea: Función clase trayectoria canonize () retirado - que significa que fue una vez en la biblioteca, pero ya no se --la definición de obsoleto.
Brian Jack
2
@BrianJack Es lo canonizeque está en desuso, según su segundo enlace, pero canonicalno parece serlo (según su primer enlace, para 1_48 V3). Ahora en C ++ 17 tenemos std::filesystempor supuesto
zdim
3

Esto funcionó en wxWidgets: (Sé que debería usar las utilidades 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...      
}
Arrozal
fuente
1

Llamar myPath.generic_string()hará lo que necesita.

J.Adler
fuente
0

Hacer esto

path.c_str();

Deberías estar bien.

Calorificado
fuente