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
,则返回目标路径,但仅当目标存在且与链接位于同一台计算机上时才会返回。如果链接指向另一台计算机,则会收到网络权限错误。如果链接指向本地 - 不存在的文件,则会收到文件未找到错误。
答案 0 :(得分:13)
最终路径是路径 路径完全时返回 解决。例如,对于象征性的 名为“C:\ tmp \ mydir”的链接指向 到“D:\ yourdir”,最终的文件系统 路径是“D:\ yourdir”。