0

我有一个项目,我必须得到一个路口的目标。这是我想出的一些代码:

#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。对于路口,它会抛出一个“错误 5”,带有GetLastError(). 有谁知道是什么原因造成的?

4

1 回答 1

-1

我到了它的底部。takeown /f "C:\users\test\Documents\My Videos" /r /d y在任何 C++ API 可以打开文件系统对象的句柄之前,您首先必须这样做。

编辑2:

对于将来阅读此内容的任何人。上面的代码是可以工作的,但是只有当你takeown在关头使用命令的时候。在takeown使用之前,有一个Everyone:(DENY)(S,RD)关于标准 Windows 连接的策略,它拒绝所有用户读取访问权限。获得该策略后,该策略就消失了,并且该联结点也可以在 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

于 2017-10-22T00:06:49.933 回答