Windows 6(Vista 和 Server 2008)支持正确的符号链接,可以通过CreateSymbolicLink函数创建。但是似乎没有相应的函数来询问符号链接以获取链接目标的路径。
我发现符号链接是重解析点的一种实现,所以重解析点函数可以用来获取目标路径。但是我需要使用重解析点的头文件似乎随Windows Driver Kit一起提供。用 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
未指定,则返回目标路径,但前提是目标存在并且与链接位于同一台机器上。如果链接指向另一台机器,我会收到网络权限错误。如果链接指向本地 - 不存在 - 文件,我会收到文件未找到错误。