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

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

我想打开目录句柄,这样我就可以查看该目录中的文件更改。我已经在winapi上编写了一个简单的类包装器,下面是我在启动watch之前设置目录路径的方式:

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
。不得使用