2013-04-07 9 views
2

Я хочу контролировать папку в своей файловой системе. Пусть говорят, что я хочу, чтобы контролировать папку: C: \ MyNewFolderFindFirstChangeNotification уведомляет об изменениях дважды

У меня есть этот код, чтобы сделать это:

HANDLE ChangeHandle=FindFirstChangeNotification(_T("C:\\\MyNewFolder"),FALSE,FILE_NOTIFY_CHANGE_LAST_WRITE); 
for(;;) 
{ 
    DWORD Wait=WaitForSingleObject(ChangeHandle,INFINITE); 
    if (Wait == WAIT_OBJECT_0) 
    { 
     MessageBox(NULL,_T("Change"),_T("Change"),MB_OK); 
     FindNextChangeNotification(ChangeHandle); 
    } 
    else 
    { 
     break; 
    } 
} 

Я хочу иметь MessageBox, что уведомляющее меня о любом изменении файла в моей папке. Этот код работает отлично, но у меня есть одна проблема. Проблема в том, что я получил 2 уведомления для каждого изменения. В чем проблема с моим кодом? Спасибо.

ответ

7

Это совершенно нормально. Изменение файла обычно связано с изменением данных файла, а также с изменением записи в каталоге. Там хранятся свойства метаданных, такие как длина файла и последняя дата записи. Поэтому вы получите уведомление обоим. ReadDirectoryChangesW() не отличается от других.

Это не отличается от процесса, делающего несколько изменений в одном файле. Обязательно выполняйте оба условия. Обычно это включает таймер, поэтому вы не переходите за борт с количеством операций, которые вы выполняете при уведомлении. Такой таймер также часто требуется, потому что процесс, который меняет файл, по-прежнему имеет блокировку, которая мешает вам делать что-либо с файлом. До тех пор, пока процесс не завершит файл, неопределенное количество времени позже.

2

Возможно, вы видите несколько изменений в одном файле (например, файл, который создается, а затем записывается или файл записывается несколько раз и т. Д.). К сожалению, FindFirstChangeNotification не говорит вам, что на самом деле произошло.

Вам необходимо использовать ReadDirectoryChangesW для уведомления о передаче файла, поскольку он фактически скажет вам , что изменилось с.