未加/D参数的无效目录符号链接:CreateFile调用失败与路径获取
文件型符号链接指向目录的访问与目标路径获取方案
一、CreateFile的正确参数配置
你用mklink link path/to/dir创建的是文件类型符号链接(未加/D参数),哪怕它指向目录,Windows仍会将其标记为文件属性。此时调用CreateFile必须按文件类型打开,同时添加FILE_FLAG_OPEN_REPARSE_POINT避免自动解析链接,否则会因属性不匹配触发"Access Denied"错误:
HANDLE hLink = CreateFile( path_to_link, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OPEN_REPARSE_POINT, NULL );
FILE_FLAG_OPEN_REPARSE_POINT:强制打开符号链接本身,而非尝试解析到目标目录(这是解决权限错误的核心)FILE_ATTRIBUTE_NORMAL:匹配文件类型符号链接的默认属性
打开成功后,可通过GetFinalPathNameByHandle获取目标的绝对路径。
二、无需CreateFile的目标路径获取方法
方法1:用FindFirstFile解析重解析点
直接通过FindFirstFile读取符号链接的重解析数据,无需打开文件句柄:
WIN32_FIND_DATA findData; HANDLE hFind = FindFirstFile(path_to_link, &findData); if (hFind != INVALID_HANDLE_VALUE) { if (findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { wchar_t targetPath[MAX_PATH]; // Windows 10及以上可用GetSymbolicLinkTarget直接获取目标 if (GetSymbolicLinkTargetW(path_to_link, targetPath, MAX_PATH)) { wchar_t absolutePath[MAX_PATH]; // 转换为绝对路径 GetFullPathNameW(targetPath, MAX_PATH, absolutePath, NULL); // 此处使用absolutePath即可 } // 旧系统需手动解析SYMBOLIC_LINK_REPARSE_BUFFER格式的cAlternateFileName } FindClose(hFind); }
方法2:命令行快速查看(非代码方案)
如果允许用命令行,执行以下命令即可直接看到符号链接的目标:
dir /al link
输出中会明确标注该链接指向的路径,可直接提取或通过脚本处理。
核心注意点
- "Access Denied"的本质是:你试图用目录属性打开文件类型的符号链接,系统权限校验不通过,必须按文件类型+重解析点参数处理。
- 无论创建时是否误指向目录,只要是文件类型符号链接,就必须遵循文件类重解析点的处理逻辑。
内容的提问来源于stack exchange,提问作者Dniel BV
相关产品推荐
相关产品推荐

