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