#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);
}