关于ReadDirectoryChangesW多次通知???
我只修改一次文件,为什么下面代码会打印多次呢??
#include <stdio.h>#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){ HANDLE hand = CreateFile( "D:\\Test", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); char notify[1024] = {0}; FILE_NOTIFY_INFORMATION *pnotify=(FILE_NOTIFY_INFORMATION *)notify; DWORD cbBytes; while(true) { BOOL ret = ReadDirectoryChangesW(hand, ¬ify, sizeof(notify), TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_FILE_NAME, &cbBytes, NULL, NULL); if(ret) { char AnsiChar[1024] = {0}; WideCharToMultiByte(CP_ACP,0,pnotify->FileName,pnotify->FileNameLength/2,AnsiChar,1024,NULL,NULL); if(FILE_ACTION_MODIFIED == pnotify->Action) { printf("%s Modified\n",AnsiChar);//为什么会打印多次??? } else if (FILE_ACTION_ADDED == pnotify->Action) { printf("%s Add\n",AnsiChar); } else if (FILE_ACTION_REMOVED == pnotify->Action) { printf("%s Removed\n",AnsiChar); } } } return 0;}if(true) { BOOL ret = ReadDirectoryChangesW(hand, ¬ify, sizeof(notify), TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_FILE_NAME, &cbBytes, NULL, NULL); if(ret) { char AnsiChar[1024] = {0}; WideCharToMultiByte(CP_ACP,0,pnotify->FileName,pnotify->FileNameLength/2,AnsiChar,1024,NULL,NULL); if(FILE_ACTION_MODIFIED == pnotify->Action) { printf("%s Modified\n",AnsiChar);//为什么会打印多次??? } else if (FILE_ACTION_ADDED == pnotify->Action) { printf("%s Add\n",AnsiChar); } else if (FILE_ACTION_REMOVED == pnotify->Action) { printf("%s Removed\n",AnsiChar); } } }
[解决办法]
像word,excel等分块写入的软件当然会多次通知。而且改名,复制,新建都会多出一个Modify通知。