Блокирует ли ReadDirectoryChanges доступ на запись? - PullRequest
0 голосов
/ 24 апреля 2019

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

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, &by, 0, 0); 
    ... // Process changes and upload them
}

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

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

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

1 Ответ

0 голосов
/ 24 апреля 2019

Когда вы открываете каталог, вы предоставляете доступ только для чтения, но не для записи.Добавьте флаг 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...