Блокирует ли ReadDirectoryChanges доступ на запись?

#visual-studio #winapi

#visual-studio #winapi

Вопрос:

У меня есть приложение, которое отслеживает изменения в каталоге и загружает их на сервер.

 auto hdir = CreateFile(dir.c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
for (;;)
{
    vector<char> d(16384);
    DWORD by = 0;
    ReadDirectoryChangesW(hdir, d.data(), 16384, false, FILE_NOTIFY_CHANGE_LAST_WRITE, amp;by, 0, 0); 
    ... // Process changes and upload them
}
  

Однако, похоже, что ReadDirectoryChanges блокирует некоторый доступ на запись. Когда Visual Studio запускает проект в отслеживаемом каталоге, он жалуется, что для этого каталога требуется доступ администратора (но нет попытки что-либо записать, ReadDirectoryChanges() не возвращается из моего приложения).

Когда файл обновляется, функция правильно возвращает, и я обрабатываю его, однако я заметил, что несколько раз Visual Studio создает временный файл внутри каталога, вероятно, файл восстановления.

Что не так с этой функцией?

Ответ №1:

Когда вы открываете каталог, вы предоставляете только доступ на чтение, а не на запись. Добавьте FILE_SHARE_WRITE флаг:

 auto hdir = CreateFile(..., FILE_SHARE_READ | FILE_SHARE_WRITE, ...);
  

Кроме того, вы вообще не проверяете наличие ошибок.

 auto hdir = CreateFile(...);
if (hdir == INVALID_HANDLE_VALUE) {
    // handle error...
}
else {
    for (;;) {
        ...
        if (!ReadDirectoryChangesW(...)) {
            // handle error...
            break;
        }
        ...
    }
    CloseHandle(hdir);
}