我有一个项目,我必须得到一个交叉点的目标。这是我提出的一些代码:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#define BUFSIZE MAX_PATH
using namespace std;
int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;
hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Videos",
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}
CloseHandle(hFile);
//wcout << Path;
return 0;
}
现在,奇怪的是代码很好地为每个目录返回GetFinalPathNameByHandle
,除了结点/重新分析点Documents \ My Videos。对于交叉点,它会向GetLastError()
抛出“错误5”。有谁知道是什么原因造成的?
答案 0 :(得分:-1)
我到底了。在任何C ++ API可以打开文件系统对象的句柄之前,您首先必须执行takeown /f "C:\users\test\Documents\My Videos" /r /d y
。
编辑2:
对于将来读这篇文章的人。上面的代码可以工作,但只有在关键时刻使用takeown
命令时才能使用。在takeown
使用之前,标准Windows联结上存在Everyone:(DENY)(S,RD)
策略,该策略拒绝所有用户读取访问权限。在该策略消失后,该联结也可在Windows资源管理器中使用。
编辑:这是C ++中的工作解决方案,不使用takeown命令:
#define BUFSIZE MAX_PATH
using namespace std;
int main()
{
TCHAR Path[BUFSIZE];
DWORD dwRet;
HANDLE hFile;
hFile = CreateFile(L"C:\\Users\\Test\\Documents\\My Music",
0,
0,
0,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d)\n", GetLastError());
return 0;
}
dwRet = GetFinalPathNameByHandle(hFile, Path, BUFSIZE, VOLUME_NAME_DOS);
if (dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}
CloseHandle(hFile);
return 0;
}
此代码的产品是C:\users\test\Documents\My Music