Как мне обработать многократное уведомление о ReadDirectoryChangesW()?
Я реализовал с помощью функции ReadDirectoryChangesW(), чтобы выяснить любую информацию об изменениях файлов конкретного каталога.
Однако API отправил мне дублированные уведомления. Например, я отслеживаю каталог "C:\abc\", используя только флаг FILE_NOTIFY_CHANGE_SIZE, не просматривая подкаталог. И я попытался отредактировать и сохранить файл изображения в каталоге. ex) C:\abc\imageFile.png
Затем два или намного больше уведомлений были отправлены мне. На самом деле, я понимаю, почему есть несколько уведомлений. Я прочитал эту статью. ( http://blogs.msdn.com/b/oldnewthing/archive/2014/05/07/10523172.aspx) Но я не знаю, как обрабатывать множественные уведомления.
Моя цель - синхронизировать файлы изображений в некоторых приложениях win32, когда изображения меняются.
1 ответ
Документация для FILE_NOTIFY_INFORMATION
говорит нам:
NextEntryOffset Количество байтов, которые необходимо пропустить, чтобы перейти к следующей записи. Нулевое значение указывает на то, что это последняя запись.
Таким образом, мы проверяем это поле, и если оно не равно нулю, мы создаем новый указатель, который на столько байтов превосходит старый. Код будет выглядеть примерно так:
FILE_NOTIFY_INFORMATION* p = &s.changeInformation;
while (1) {
std::wcout << L" action " << p->Action << L"\n";
std::wcout << L" file ";
std::wcout.write(p->FileName, p->FileNameLength / sizeof (wchar_t)) << L"\n";
if (!p->NextEntryOffset) break;
p = reinterpret_cast<decltype(p)>(p->NextEntryOffset + reinterpret_cast<uintptr_t>(p));
}
Мы должны привести, потому что значение в байтах, и арифметика указателя автоматически измеряет расстояния в объектах, а не в байтах.