Change Notification приходит два раза
От: Jerum  
Дата: 13.10.08 15:22
Оценка:
Отслеживаю в директории 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 идеологически более верный.
Что же здесь не так?
Re: Change Notification приходит два раза
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 13.10.08 15:50
Оценка:
Здравствуйте, Jerum, Вы писали:

J>Отслеживаю в директории fPath изменения с помощью механизма FindFirstChangeNotification/FindNextChangeNotification

J>Вот такой код.
Мыслю так:
1) поймати изменение файла — сигнализируем
2) поймали изменение каталога (файл-то в каталоге изменился) — сигнализируем

J>Если изменить фильтр на FILE_NOTIFY_CHANGE_SIZE то приходит один раз, но флаг FILE_NOTIFY_CHANGE_LAST_WRITE идеологически более верный.

J>Что же здесь не так?

FILE_NOTIFY_CHANGE_LAST_WRITE — последний доступ к файлу/каталогу. Вне зависимости, изменился размер или нет.
FILE_NOTIFY_CHANGE_FILE_SIZE для каталогов особого смысла не имеет (разве что размер диска по нему отслеживать).
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[2]: Change Notification приходит два раза
От: Jerum  
Дата: 13.10.08 16:00
Оценка:
DM>Мыслю так:
DM>1) поймати изменение файла — сигнализируем
DM>2) поймали изменение каталога (файл-то в каталоге изменился) — сигнализируем

Я тоже об этом подумал, но так не должно быть, потому-что эта функция извещает об изменениях самой директории как нечто целого, вне зависимости от того, сколько внутри нее файлов изменилось, по крайней мере я так понял из описания в справочнике. Кроме того я проделал небольшой тест, включил флаг слежения за подкаталогами, и внутри подкаталога изменил файл, тогда по такой логике извещение должно было прийти три раза — на файл, на подкаталог и на каталог, но пришло все же два раза.
Re: Change Notification приходит два раза
От: Аноним  
Дата: 13.10.08 17:20
Оценка:
Во первых, а вы уверены что апликуха делает лишь одну запись в файл? А вдруг там два WriteFile'а или больше...
change notification это такая вещь.. Не следует думать что как только какаято апликуха изменила файл вы тутже получите уведомление, вы их можете получить чуть позже, кроме того пока вы его будете обрабатывать этот файл может быть уже изменен еще раз или удален.. Это не перехват, а всего лишь асинхронное уведомление.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.