CreateFile всегда возвращает ошибку 5 (доступ запрещен) при попытке открыть каталог для чтения - PullRequest
0 голосов
/ 11 июля 2019

Я хочу открыть дескриптор каталога, чтобы я мог наблюдать за этим каталогом на предмет изменений файла. Я написал простую оболочку класса поверх 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 (мне нужен только каталог dir) и GENERIC_READ. Ошибка осталась прежней.

Может быть, параметры CreateFile неверны?

1 Ответ

1 голос
/ 11 июля 2019

Не использовать FILE_ATTRIBUTE_NORMAL!

Чтобы открыть каталог с помощью CreateFile, используйте FILE_FLAG_BACKUP_SEMANTICS вместо FILE_ATTRIBUTE_NORMAL.

Вы должны указать FILE_FLAG_BACKUP_SEMANTICS в параметре dwFlagsAndAttributes.

Теперь это должно работать.

...