Я использую ReadDirectoryChangesW (Windows API) в асинхронном режиме в сочетании с GetQueuedCompletionStatus .Как я могу обнаружить возможное переполнение буфера, чтобы понять, что по крайней мере одно событие изменения файловой системы было потеряно?
При использовании ReadDirectoryChangesW в асинхронном режиме вы получите первую группу событий, затем вам придется вызывать ее снова для получения дополнительных событий.Наличие большего количества событий, чем умещается в ваш буфер, не является ошибкой.Наличие большего количества событий, чем умещается в буфере уровня операционной системы, является условием ошибки, и вы обнаруживаете так:
ReadDirectoryChangesW
GetLastError() == ERROR_NOTIFY_ENUM_DIR
dwBytesTransferred == 0
Если число переданных байтов равно нулю, буфер слишком велик для системывыделять или слишком мало для предоставления подробной информации обо всех изменениях, произошедших в каталоге или поддереве.В этом случае вы должны вычислить изменения, перечислив каталог или поддерево.
Возможно, вы не сможете выполнить обнаружение таким образом, но здесь - это отличное руководство, которое может помочь.
Вы также можете проверить ответ на этот другой вопрос.
Судя по здесь , похоже, что такой код ошибки не возвращается асинхронно .
Предложение: следите за изменениями синхронно, но в выделенном потоке, и следите за ERROR_NOTIFY_ENUM_DIR.
ERROR_NOTIFY_ENUM_DIR