ReadDirectoryChangesW не сообщает о последних событиях записи - PullRequest
0 голосов
/ 15 октября 2019

Мне удалось заставить ReadDirectoryChangesW() работать для папок, которые нужно отслеживать. Я использую подпрограмму IO Completion, и весь мониторинг изменений выполняется потоком, который ничего не делает, кроме ожидания изменений и сигнала для остановки. Это все работает отлично. Процедура завершения в настоящее время просто регистрирует измененное имя файла и действие из записи уведомления в системный журнал отладки. Опять же, похоже, работает нормально. Во время тестирования я жду всех доступных событий (маска 0x017F).

У меня такой вопрос: почему я НИКОГДА не вижу никаких событий изменения ПОСЛЕДНЕГО ЗАПИСИ, когда, скажем, Блокнот сохраняет измененный файл?

Изначально я ждал только событий FILE_NOTIFY_CHANGE_CREATION, _LAST_WRITE и _FILE_NAME и удивлялся, почему я никогда не видел последних событий записи (но я действительно видел события _DIR_NAME, которых я НЕ ожидал), поэтому я решил подождать всего.

Мой код в настоящее время очень похож на то, что я нашел здесь в качестве примера: ReadDirectoryChangesW

Во время отладки я использовал FindFirstFile(), чтобы получить копию WIN32_FIND_DATA до и послеизменив отслеживаемый файл, чтобы убедиться, что изменилось время последней записи - это произошло. Так почему нет уведомления? Что-то особенное, что мне нужно сделать, чтобы включить это?

1 Ответ

0 голосов
/ 15 октября 2019

Оказывается, я не прочитал достаточно документации. Я неправильно предположил, что действие, данное процедуре завершения, будет использовать те же значения битовой маски, что и символы FILE_NOTIFY_CHANGE _ ***. В конце концов, имеет смысл только вернуть то, что я положил, верно?

Нет. Процедура завершения получает значение от 1..5 для действия «Добавлено», «Удалено», «Изменено», «Переименовано (oldName)», «Переименовано» («newName»). Для справки, настоящие имена символов похожи на FILE_ACTION_REMOVED.

. Это разочаровывает, потому что 5 из 8 вещей, которые можно отслеживать, все станут FILE_ACTION_MODIFIED, в то время как остальные 3 вещи, которые можно отслеживать, отображаются на карту. оставшиеся 4 символа FILE_ACTION.

Я оставлю свой тупой вопрос на тот случай, если у других возникнет аналогичная проблема.

...