Encontré una entrada de blog con la función más completa, incluso elaborada, que he visto para resolver este problema. Maneja cualquier cosa, incluso casos de esquinas horribles como V:foo.txt
donde usaste el comando subst
para mapear V:
a Z:
pero ya usaste subst
para asignar Z:
a alguna otra unidad; gira hasta que se desenrollan todos los comandos subst
. URL:
http://pdh11.blogspot.com/2009/05/pathcanonicalize-versus-what-it-says-on.html
Mi proyecto es el código C puro, y que la función es C++. Empecé a traducirlo, pero luego descubrí que podía obtener la ruta normalizada que quería con una llamada a la función: GetLongPathName(). Esto no manejará los horribles casos de esquina, pero manejó mis necesidades inmediatas.
descubrí que GetLongPathName("foo.txt")
sólo devuelve foo.txt
, pero sólo anteponiendo ./
al nombre de archivo que tiene la expansión de forma normalizada:
GetLongPathName("./foo.txt")
, si se ejecuta en el directorio C:\Users\steveha
, devuelve C:\Users\steveha\foo.txt
.
Así, en pseudocódigo:
si el segundo carácter del nombre de ruta se ':' o el primer carácter sea '/' o '\', simplemente llame GetLongPathName() otra cosa, copiar "./" a un búfer temporal, luego copie el nombre de archivo al búfer temporal + 2, para obtener una copia del nombre de archivo junto con "./" y luego llame a GetLongPathName().
Mientras las dos rutas se resuelvan en archivos en la misma computadora, parece que GetFileInformationByHandle() es la respuesta correcta.Si se resuelven en diferentes computadoras, no veo una garantía, y tampoco veo una manera trivial de obtener una. No es necesariamente fácil probar esto. – RBerteig
Todos los archivos son locales en mi caso, así que esto funciona. –
@RBerteig: tampoco veo una forma trivial de obtener uno. Pero encontré uno muy no trivial y lo puse en una respuesta; echar un vistazo. Incluso ese solo es casi infalible, pero debería ser más que suficiente para la mayoría de las personas. – steveha