Как связывать уведомления о переименовании файла в Windows

API ReadDirectoryChangesW при переименовании файла генерирует два разных события: FILE_ACTION_RENAMED_OLD_NAME и FILE_ACTION_RENAMED_NEW_NAME. Неправильно полагаться только на соседство этих событий в очереди как на надёжный способ сопоставления старого и нового имён.

Наблюдение не заменяет контракт

Практическое наблюдение показывает, что реализация часто выдаёт оба события подряд, но это не гарантия. Нет доказанного правила, обязывающего файловую систему или драйвер строго сохранять такой порядок, поэтому связывать события исключительно по близости в очереди — рискованно.

Когда использовать идентификаторы файлов

ReadDirectoryChangesExW в расширенном режиме может возвращать дополнительные поля, такие как FileId и ParentFileId. Эти идентификаторы позволяют уверенно соотнести старое и новое состояние файла независимо от порядка событий и совпадения имён, если механизм поддерживается на наблюдаемой файловой системе.

Обработка потери уведомлений

Наблюдатель должен учитывать возможность потери или переполнения буфера уведомлений. В случае переполнения документация рекомендует восстановить текущее состояние каталога путём явного перечисления каталога или поддерева. Очередь событий не следует рассматривать как непрерывный и безошибочный журнал; дополнительные механизмы согласования (например, проверка идентификаторов или сканирование каталога) повышают надёжность.