Файл монитора с readdirectorychangesw
Недавно я выполнял задачу по мониторингу файлов в win32 c++.
Существует программное обеспечение, которое вызывает некоторый WriteFile() и FlushFileBuffer() каждые 12 secondes.So,есть пять изменений в файле за одну минуту.
Программа вызывает функцию WriteFile() для записи инкрементной временной метки в некоторую позицию файла,затем вызывает функцию WriteFile() в другую позицию файла и,наконец, вызывает функцию FlushFileBuffer.
Следующая запись-это шоу с "process monitor",которое может объяснить, что делает программное обеспечение:
14:20:11.299 Смещение Файла Записи:1153 Длина:63724
14:20:11.304 Смещение Файла Записи:64877 Длина:63724
14:20:23.304 FlushFileBuffer
14:20:23.327 Смещение Файла Записи:1153 Длина:63724
14:20:23.306 Смещение Файла Записи:64877 Длина:63724
14:20:23.204 FlushFileBuffer
14:20:35.348 Смещение Файла Записи:1153 Длина:63724
14:20:35.325 Смещение Файла Записи:64877 Длина:63724
14:20:35.268 FlushFileBuffer
Моя работа-следить за изменениями файла,когда меняется его контекст,я читаю файл и получаю метку времени из какой-то позиции файла.
Я использую ReadDirectoryChangesW() с процедурой завершения.И как только файл изменяется,вызывается процедура завершения, поэтому я могу быть уверен, что каждое изменение файла фиксируется.
Но после того, как я захватил изменение файла,я начинаю читать файл, потому что временная метка, о которой говорилось выше, является инкрементной, нормальная ситуация должна быть :
...
файл изменяется в N-й момент, считайте файл, значение метки времени равно time_n
файл изменяется в точке (N+1)th,считывается файл, значение метки времени равно time_n+1
...
но иногда ситуация такова
...
изменения файла в N-М,чтение файла, считывание значения метки времени-time_n
файл изменяется в точке (N+1)th,считывание файла, считывание значения метки времени-time_n
...
или
...
изменения файла в N-М,чтение файла, считывание значения метки времени-time_n+1
файл изменяется в точке (N+1)th,считывание файла, считывание значения метки времени-time_n+1
...
Я сомневаюсь, что ReadDirectoryChangesW может только сказать нам, что файл изменился и какая-то другая информация.Но это не гарантирует, что когда я получаю ответ на изменение файла, содержимое файла полностью сбрасывается на диск с помощью FlushFileBuffer.
У вас есть какие-нибудь комментарии по этому вопросу?
Что я уже пробовал:
Я попробовал "CDirectoryChangeWatcher",и там тоже такая ситуация.