C++ 试图打开目录进行读取时,CreateFile始终返回错误5(访问被拒绝)
我想打开目录句柄,这样我就可以查看该目录中的文件更改。我已经在winapi上编写了一个简单的类包装器,下面是我在启动watch之前设置目录路径的方式:C++ 试图打开目录进行读取时,CreateFile始终返回错误5(访问被拒绝),c++,winapi,createfile,C++,Winapi,Createfile,我想打开目录句柄,这样我就可以查看该目录中的文件更改。我已经在winapi上编写了一个简单的类包装器,下面是我在启动watch之前设置目录路径的方式: bool SetDirectory(const std::string& dirname) { HANDLE dirHandleNew = CreateFile( dirname.c_str(), // Just normal reading FILE_GENERIC_READ, // Share al
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在我的电脑中是一个普通文件夹,所有用户都可以访问。但正如我所说,我也尝试了其他文件夹,错误总是一样的
我还尝试使用文件列表目录
(我只需要目录列表)和通用读取
打开。错误仍然是一样的
可能是CreateFile
参数错误?不要使用文件属性\u正常
要使用CreateFile打开目录,请使用FILE\u FLAG\u BACKUP\u SEMANTICS
而不是FILE\u ATTRIBUTE\u NORMAL
您应该在dwFlagsAndAttributes
参数中指定FILE\u FLAG\u BACKUP\u语义
现在应该可以了。不要使用文件属性\u正常
要使用CreateFile打开目录,请使用FILE\u FLAG\u BACKUP\u SEMANTICS
而不是FILE\u ATTRIBUTE\u NORMAL
您应该在dwFlagsAndAttributes
参数中指定FILE\u FLAG\u BACKUP\u语义
现在应该可以使用了。不接受文件句柄,您想做什么?是否尝试了使用CreateFile“打开”目录句柄的一个强制标志的可能重复?即文件\u标志\u备份\u语义
CreateFile
清楚地记录了这一点:“必须设置此标志才能获得目录句柄。目录句柄可以传递给某些函数,而不是文件句柄。”。这并不重要;我怀疑目录句柄获取是XY问题的根源。因为win32错误是非常糟糕的设计。您没有被拒绝访问。如果调用RtlGetLastNtStatus()
,则得到的STATUS\u文件是一个目录。因为您没有添加文件\u标志\u备份\u语义
。只需win32将状态\u文件\u是\u A\u目录
转换为错误\u访问被拒绝
@AlanBirtles查找文件更改通知
功能不足,请比较ReadDirectoryChangesW
。如果不接受文件句柄,您将尝试执行什么操作?是否尝试使用CreateFile“打开”目录句柄的一个强制标志可能重复?即文件\u标志\u备份\u语义
CreateFile
清楚地记录了这一点:“必须设置此标志才能获得目录句柄。目录句柄可以传递给某些函数,而不是文件句柄。”。这并不重要;我怀疑目录句柄获取是XY问题的根源。因为win32错误是非常糟糕的设计。您没有被拒绝访问。如果调用RtlGetLastNtStatus()
,则得到的STATUS\u文件是一个目录。因为您没有添加文件\u标志\u备份\u语义
。只需win32将状态\u文件\u是\u A\u目录
转换为错误\u访问被拒绝
@AlanBirtles查找文件更改通知
功能不足,请比较ReadDirectoryChangesW
。不得使用