2012-09-28 27 views
24

Mi directorio de trabajo actual se encuentra en /home/myuser/program, creé un objeto boost::filesystem::path apuntando a él. Anexé /../somedir por lo que se convierte en /home/myuser/program/../somedir. Pero necesito obtener su ruta absoluta resuelta, que sería /home/myuser/somedir.Obtener ruta absoluta con boost :: filesystem :: ruta

Lo he estado intentando durante mucho tiempo y no encuentro ningún método en their reference para hacer esto. Hay un método llamado make_absolute, que parece que se supone que haga lo que espero, pero tengo que darle un argumento de ruta "raíz". ¿Cuál debería ser? ¿Realmente necesito hacer esto para obtener el camino real absoluto? ¿Hay alguna otra manera?

Respuesta

21

Dice que quiere una ruta absoluta, pero su ejemplo muestra que ya tiene una ruta absoluta. El proceso de eliminación de los componentes .. de una ruta se conoce como canonicalización. Para eso, debes llamar al canonical. También realiza la tarea de absolute, por lo que no necesita llamar primero al absolute o al make_absolute. La función make_absolute requiere una ruta base; puede pasarlo current_path() si no tiene nada mejor.

+0

Exatcly. No quería usar la palabra "canónico" ya que no estaba seguro de si también significaba enlaces simbólicos resueltos y cosas así, por ejemplo. Intenté tu sugerencia y funcionó de inmediato. Gracias. – Mario

+3

Tenga en cuenta que canonical arroja una excepción si el archivo no existe. Entonces podrías construir solo la ruta existente. –

1

El documentation shows que el make_absolute tiene un segundo parámetro opcionalque por defecto en su camino actual:

path absolute(const path& p, const path& base=current_path());

intentar hacerlo sin el segundo parámetro y ver si devuelve los resultados que usted está buscando .

+0

Esa es una de las incoherencias que me molestaba un poco, en los documentos. Hay un método 'make_absolute' que tiene un parámetro, cuando sigo el enlace, me dirige a la documentación de una función' absolute() 'que acepta dos parámetros. Aún así, hacerlo como 'absolute (pathObject) .string()' devolverá la misma ruta no resuelta. Esto es lo que sugirió, ¿verdad? – Mario

0

Tengo que darle un argumento de ruta "raíz".

Check the docs: no lo hace tener que darle nada; tiene un segundo parámetro predeterminado. Es decir, el directorio actual.

Las rutas relativas son relativas a algún directorio. Por lo tanto, al hacer una ruta absoluta, debe saber qué debe ser absoluto relativo a. Esa es la "ruta raíz": el directorio en el que está relacionado.

9

actualización, ya que esto todavía parece ser primero éxito de Google en relación con rutas absolutas:

A partir de 1,57 Boost, algunas de las funciones anteriormente sugeridos han sido retirados.

La solución que trabajó para mí fue

boost::filesystem::path canonicalPath = boost::filesystem::canonical(previousPath, relativeTo); 

(utilizando el método independiente canonical(), definido en realce/sistema de archivos/operations.hpp, que se incluye de forma automática a través de realce/filesystem.hpp)

Importante: si llama canónico a una ruta que no existe (p. Ej., Desea crear un archivo) emitirá una excepción. En ese caso, su próxima mejor apuesta es probablemente boost :: filesystem :: absolute(). También funcionará para las rutas que no existen, pero no eliminará los puntos en el medio de la ruta (como en a/b/c /../../ d.txt). Nota: asegúrese de que relativeTo haga referencia a un directorio que llame a parent_path() en las rutas que hacen referencia a los archivos (p.el archivo abierto que contenía un directorio o ruta de archivo relativa a sí mismo).

+0

¿Qué es una cadena de ruta de ejemplo de "previousPath" y "relativeTo"? No puedo entender cómo debe ser la entrada en términos de estilo de ruta. –

+0

La ruta de acceso anterior podría ser similar a la ruta ("../../ readme.txt"), con relativeTo = ruta ("c:/example/test/blah") esto debería resolverse a "c:/example/readme". TXT". No estoy seguro de qué hace relativeTo (o si incluso se requiere una entrada sensible), si la ruta anterior ya es absoluta. – Daniel

Cuestiones relacionadas