Windows 6(Vista和Server 2008)支持正确的符号链接,可以通过CreateSymbolicLink函数创建.但似乎没有相应的函数来询问符号链接以获得链接目标的路径.
我发现符号链接是重新分析点的实现,因此重新分析点函数可用于获取目标路径.但我需要使用重新分析点的头文件似乎与Windows驱动程序工具包一起提供.使用VS2008设置此套件似乎是一项非常重要的任务.
有没有一个很好的简单函数,我错过了获取链接的目标,或者我是否真的必须设置一个Windows驱动程序开发环境只是为了编写代码来访问这些信息?
编辑:Adam Mitz提出了GetFinalPathNameByHandle的建议.此函数适用于本地符号链接,但似乎不适用于解析远程链接(通过UNC路径).
编辑2:在亚当的要求下,这里有更多关于我尝试过的细节:
我最初走了FSCTL_GET_REPARSE_POINT
/ DeviceIoControl
路线,但这产生了一个REPARSE_DATA_BUFFER
结构.定义此结构的标头似乎仅存在于Windows驱动程序工具包中.
GetFinalPathNameByHandle()
当链接存在于本地磁盘(C:\...\link
等)上时工作正常.奇怪的是,我发现我可以获取链接的句柄 - 从而获得目标 - 使用CreateFileW()
是否FILE_FLAG_OPEN_REPARSE_POINT
指定了标志,无论目标文件是否存在.
当CreateFileW()
和GetFinalPathNameByHandle()
(\\?\UNC\....
)用于通过()询问远程链接时,事情开始解开.如果FILE_FLAG_OPEN_REPARSE_POINT
指定,则GetFinalPathNameByHandle()
始终返回链接路径,而不是目标路径.如果FILE_FLAG_OPEN_REPARSE_POINT
未指定,则返回目标路径,但仅当目标存在且与链接位于同一台计算机上时才返回.如果链接指向另一台计算机,则会收到网络权限错误.如果链接指向本地 - 不存在 - 文件,我得到一个文件未找到错误.
GetFinalPathNameByHandle
最终路径是完全解析路径时返回的路径.例如,对于名为"C:\ tmp\mydir"的符号链接,指向"D:\ yourdir",最终的文件系统路径将为"D:\ yourdir".