CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)

CreateFile always returns error 5 (Access is denied) when trying to open directory for reading

本文关键字:错误 返回 拒绝 访问 读取 CreateFile      更新时间:2023-10-16

我想打开目录句柄,以便我可以监视该目录的文件更改。我在 winapi 上编写了一个简单的类包装器,这是我在启动手表之前设置目录路径的方式:

bool SetDirectory(const std::string& dirname)
{
HANDLE dirHandleNew = CreateFile(
dirname.c_str(),
// Just normal reading
FILE_GENERIC_READ,
// Share all, do not lock the file
FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (INVALID_HANDLE_VALUE != dirHandleNew)
{
_dirHandle = dirHandleNew;
return true;
}
else
{
_dirHandle = 0;
RLog("Cannot open directory %s for filesystem watching. Win error: %d (%s)", dirname.c_str(), GetLastError(), GetLastErrorAsString().c_str());
return false;
}
}

错误始终为:

Cannot open directory D:tools for filesystem watching. Win error: 5 (Access is denied.)

我尝试了不同卷上的不同文件夹,以查看这是否是实际的权限问题,但似乎并非如此。 我的电脑中的D:tools是一个普通文件夹,所有用户都可以访问。但正如我所说,我也尝试了其他文件夹,错误总是相同的。

我还尝试用FILE_LIST_DIRECTORY打开(我只需要目录列表)和GENERIC_READ.错误仍然是一样的。

也许CreateFile参数是错误的?

不要使用FILE_ATTRIBUTE_NORMAL!

要使用 CreateFile 打开目录,请使用FILE_FLAG_BACKUP_SEMANTICS而不是FILE_ATTRIBUTE_NORMAL

应在dwFlagsAndAttributes参数中指定FILE_FLAG_BACKUP_SEMANTICS

这现在应该有效。