2012-06-14 20 views
13

¿Cómo puedo determinar la ruta absoluta de un archivo o directorio desde una ruta relativa dada en C/C++ en GNU/Linux?
Sé acerca de realpath(), pero no funciona en archivos que no existen.¿Cómo obtener la ruta de acceso absoluta del archivo o directorio, que * no * existe?

Digamos que el usuario ingresa ../non-existant-directory/file.txt, y el directorio de trabajo de los programas es /home/user/.
Lo que necesito es una función que devuelva /home/non-existant-directory/file.txt.

Necesito esta función para verificar si una ruta determinada se encuentra en un determinado subdirectorio o no.

+0

No creo que algo así exista incorporado. Tendrá que escribir el código usted mismo. –

Respuesta

10

Trate realpath. Si falla, comience a eliminar componentes de ruta del extremo uno a la vez y vuelva a intentar realpath hasta que tenga éxito. A continuación, agregue los componentes que retiró de nuevo al resultado de la exitosa llamada realpath.

Si está seguro de que el directorio contiene y solo desea crear un archivo allí, solo tiene que eliminar como máximo un componente.

Otro enfoque sería simplemente crear primero el archivo, luego llamar al realpath.

+0

la primera solución funcionó, ¡gracias! –

0

Usted puede obtener el directorio actual y aplicar la siguiente lógica:

Si la trayectoria comienza con "/", reemplazar el directorio actual con la raíz

Para cada directorio mencionado en la ruta relativa realizar la siguiente:

  • Si usted está en la última parte de la ruta relativa, lo añadirá a la ruta del directorio actual y detener: la ruta del directorio actual es la ruta absoluta.

  • De lo contrario: compruebe si existe dicho directorio en el directorio actual.

  • Si existe, pero no es un directorio, error de la señal (a menos que la última entrada de la ruta)

  • Si existe y es un directorio, ver si es un enlace simbólico (en sistemas operativos que admiten esta característica). En caso afirmativo, reemplace el directorio actual con el apuntado a un directorio del enlace simbólico.

  • Si existe y es un directorio, pero no un enlace simbólico, añadir este directorio a la ruta del directorio actual (es decir, reemplazar el directorio actual con el subdirectorio comprobado)

  • Si no lo hace existir, anexar las partes restantes de la ruta relativa a la ruta del directorio actual y detener.

+2

Esto es esencialmente reimplementar 'realpath' usted mismo y mucho más trabajo de lo que necesita hacer. –

Cuestiones relacionadas