Отслеживаю в директории fPath изменения с помощью механизма FindFirstChangeNotification/FindNextChangeNotification
Вот такой код.
void ProcessNotification()
{
cout << "file was changed\n";
}
int LookForChangesLoop()
{
HANDLE hNotify = FindFirstChangeNotification(fPath, false,
FILE_NOTIFY_CHANGE_LAST_WRITE);
if(hNotify == INVALID_HANDLE_VALUE)
{
log.winError("Can not create notification object");
return -1;
}
for(;;)
{
int waitStatus = WaitForSingleObject(hNotify, INFINITE);
if(waitStatus == WAIT_OBJECT_0)
ProcessNotification();
if(!FindNextChangeNotification(hNotify))
{
log.winError("FindNextChangeNotification failed");
return -1;
}
}
}
При тестировании обнаружил, что уведомление об изменении приходит как бы два раза подряд, то есть стоит изменить файл внутри директории и в консоль выводится
file was changed
file was changed
Если изменить фильтр на FILE_NOTIFY_CHANGE_SIZE то приходит один раз, но флаг FILE_NOTIFY_CHANGE_LAST_WRITE идеологически более верный.
Что же здесь не так?
Во первых, а вы уверены что апликуха делает лишь одну запись в файл? А вдруг там два WriteFile'а или больше...
change notification это такая вещь.. Не следует думать что как только какаято апликуха изменила файл вы тутже получите уведомление, вы их можете получить чуть позже, кроме того пока вы его будете обрабатывать этот файл может быть уже изменен еще раз или удален.. Это не перехват, а всего лишь асинхронное уведомление.