如何在Windows c++程序中找到符号链接的目标
How to find target of symbolic link in Windows C++ program
我正在用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,则受影响的文件为目标文件。
因此,您可以尝试打开链接,这将返回目标文件的句柄,然后尝试从返回的句柄中检索文件名,参见从文件句柄中获取文件名。
我从来没有尝试过,但这只是一个你可以考虑探索的方法。
- 体系结构x86_64的未定义符号:链接器错误
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 如何将空文件夹和符号链接添加到存档 - libarchive
- boost::存在符号链接不取消引用
- c++ ReadDirectoryChangesW on directory,带有目录的符号链接
- 如何将libc++与调试符号链接起来?
- 如何使用 GetFinalPathNameByHandle 解析指向本地目录的符号链接?
- 在可执行文件中使用带有符号链接的相对路径
- 架构x86_64的未定义符号链接constexpr std :: array
- 使用dlopen()的符号链接
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- g++ 编译:我可以链接到带有符号链接二进制文件的目录吗?
- 如何在目录上迭代并识别或省略NTFS连接(符号链接ish)
- 与两个符号链接.一个在存档文件中定义
- 单一实例对象的未解决外部符号链接错误
- C++隐藏的符号链接
- 尽管存在符号链接,但 ld 无法加载库
- 导出类静态常量的未解决外部符号链接错误(仅限某些项目)
- 使用 boost 解析符号链接时,结果不等于原始路径名
- 如何在Windows c++程序中找到符号链接的目标