Как мне обработать многократное уведомление о 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));
}

Мы должны привести, потому что значение в байтах, и арифметика указателя автоматически измеряет расстояния в объектах, а не в байтах.

Другие вопросы по тегам