C ++ WinApi: ReadDirectoryChangesW () Получение двойных уведомлений
я пытаюсь понятьReadDirectoryChangesW
функция, чтобы я мог быть эффективно информирован об изменении содержимого в нескольких каталогах (файлы перезаписаны, файлы удалены, переименованы и т. д.).
Одно из моих недавних наблюдений состоит в том, что для каждого файлаоперация записиПолучаю всегдадва уведомления для одного файла.
Я проследил это очень тщательно, и я уверен, что если я перезаписываю файл (скажем, файл .txt с новым содержимым - в основном пару лишних букв внутри),ReadDirectoryChangesW()
уведомляет меня два раза за сохранение этого файла.
Это серьезная вещь, так как я ожидаю, что получит уведомление только один раз за изменение. Я не хочу непреднамеренно повторять операции, которые должны произойти только один раз в моем приложении.
Известно ли это поведение? Есть ли способ получить толькоодно уведомление за одно изменение, пожалуйста? Есть ли способ эффективноизбегать двойных уведомлений?
Я использую:
Неуправляемый C ++Visual Studio 2012Windows 7 x64Я использую довольно простой код для своих тестов, но вы захотите его увидеть, так что вот оно:
HANDLE hDir = CreateFile(
lpDir,
FILE_LIST_DIRECTORY,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
int nCounter = 0;
FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
DWORD dwBytesReturned = 0;
while(TRUE)
{
if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
{
ErrorCheck(_T("Reading Directory Change"));
}
else
{
_tcout < _T("File Modified: ") < strFileNotifyInfo[0].FileName < endl;
_tcout < _T("Loop: ") < nCounter++ < endl;
}
}