如何在Windows c++程序中找到符号链接的目标

How to find target of symbolic link in Windows C++ program

本文关键字:符号链接 目标 程序 Windows c++      更新时间:2023-10-16

我正在用Visual Studio c++ 2008和2010开发一个应用程序。我有一个简单的需求:我想找出一个符号链接(. link或快捷方式)文件的目标。我已经在网上搜索了答案,但没有任何运气。

我可以看到MSDN有两个函数来创建符号链接

WINAPI CreateSymbolicLink LPTSTR lpSymlinkFileName, LPTSTR lpTargetFileName, DWORD dwFlags

);

BOOLEAN WINAPI CreateSymbolicLinkTransacted LPTSTR lpSymlinkFileName, LPTSTR lpTargetFileName, DWORD dwFlags中In HANDLE hTransaction

);

但是我没有看到任何让你检索目标路径的东西。这对我来说似乎很奇怪,因为它是符号链接文件的基本属性。这些信息不应该保存在文件头信息中吗?

MSDN网站上推荐的一个建议是:

h = CreateFile (
        path,
        FILE_READ_ATTRIBUTES,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        0,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_REPARSE_POINT | FILE_FLAG_OPEN_REPARSE_POINT,
        0);
DeviceIoControl (
        h,
        FSCTL_GET_REPARSE_POINT,  
        NULL,
        0,
        buffer,
        bufferSize,
        &returnedDataSize,
        NULL);

但是DeviceIoControl看起来对符号链接没有意义,因为它是一个设备控制函数。我试过了,它没有工作,那就是缓冲区没有改变。

有人有这方面的经验吗?如有任何帮助,我将不胜感激。

周杰伦

. link文件不是符号链接。符号链接是文件系统本身的一个特性。这就是为什么您可以使用DeviceIoControl()来查询它们。. link文件就是一个文件。您可以使用IShellLink接口来查询和操作. link文件。

您是否尝试使用CreateFile() API打开符号链接?具体来说,这是API的文档中关于打开符号链接的说明:

如果FILE_FLAG_OPEN_REPARSE_POINT没有指定:

  • 如果一个现有的文件被打开,它是一个符号链接,返回的句柄是一个到目标的句柄。
  • 如果指定了CREATE_ALWAYS、TRUNCATE_EXISTING或FILE_FLAG_DELETE_ON_CLOSE,则受影响的文件为目标文件。

因此,您可以尝试打开链接,这将返回目标文件的句柄,然后尝试从返回的句柄中检索文件名,参见从文件句柄中获取文件名。

我从来没有尝试过,但这只是一个你可以考虑探索的方法。