una simbolico musica enlace eliminar ejemplos documentos directorios windows visual-studio-2008 symlink

simbolico - ¿Cómo puedo acceder mediante programación a la ruta de destino de un enlace simbólico de Windows?



mklink/j ejemplos (1)

Windows 6 (Vista y Server 2008) admite enlaces simbólicos adecuados, que se pueden crear a través de la función CreateSymbolicLink . Pero no parece haber una función correspondiente para interrogar a un enlace simbólico para obtener la ruta del objetivo del enlace.

Descubrí que los enlaces simbólicos son una implementación de puntos de reanálisis y, por lo tanto, las funciones del punto de reanálisis se pueden usar para obtener la ruta de destino. Pero los archivos de cabecera que necesito para usar puntos de análisis parecen venir con el Kit de controladores de Windows . Configurar este kit con VS2008 parece ser una tarea no trivial.

¿Hay alguna función sencilla y agradable que me haya perdido para obtener el objetivo de un enlace, o realmente tengo que configurar un entorno de desarrollo de controlador de Windows solo para escribir código para acceder a esta información?

EDITAR: Adam Mitz se le ocurrió la sugerencia de GetFinalPathNameByHandle. Esta función funciona muy bien para enlaces simbólicos locales, pero no parece funcionar para resolver enlaces remotos (a través de una ruta UNC).

EDIT 2: A petición de Adam, aquí hay más detalles de lo que he intentado:

Inicialmente bajé por la ruta FSCTL_GET_REPARSE_POINT / DeviceIoControl , pero eso produce una estructura REPARSE_DATA_BUFFER . Los encabezados que definen esta estructura parecen existir únicamente dentro del Windows Driver Kit.

GetFinalPathNameByHandle() funciona bien cuando el enlace existe en un disco local ( C:/.../link etc.). Curiosamente, descubrí que podía obtener el control del enlace y, por lo tanto, obtener el objetivo utilizando CreateFileW() , independientemente de si el archivo de destino existe o no, el indicador FILE_FLAG_OPEN_REPARSE_POINT .

Cuando CreateFileW() y GetFinalPathNameByHandle() se utilizan para interrogar a un enlace remoto ( //?/UNC/.... ), las cosas comienzan a deshacerse. Si se especifica GetFinalPathNameByHandle() , GetFinalPathNameByHandle() siempre devuelve la ruta del enlace, no la ruta de destino. Si no se especifica FILE_FLAG_OPEN_REPARSE_POINT se FILE_FLAG_OPEN_REPARSE_POINT la ruta de destino, pero solo si el destino existe y está en la misma máquina que el enlace. Si el enlace apunta a otra máquina, recibo un error de permisos de red. Si el enlace apunta a un archivo local que no existe, aparece un error de archivo no encontrado.


GetFinalPathNameByHandle

Una ruta final es la ruta que se devuelve cuando una ruta se resuelve por completo. Por ejemplo, para un enlace simbólico llamado "C: / tmp / mydir" que apunta a "D: / yourdir", la ruta final del sistema de archivos sería "D: / yourdir".