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

时间:2019-07-11 10:21:40

标签: c++ winapi createfile

我想打开目录句柄,以便可以查看该目录中的文件更改。我已经在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.)

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

我还尝试用FILE_LIST_DIRECTORY(我只需要目录列表)和GENERIC_READ打开。错误仍然相同。

也许CreateFile参数错误?

1 个答案:

答案 0 :(得分:1)

不要使用FILE_ATTRIBUTE_NORMAL!

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

您应该在FILE_FLAG_BACKUP_SEMANTICS参数中指定dwFlagsAndAttributes

现在应该可以使用。