用MFC做文件监视软件..我想先用单(主)线程实现一个测试程序,主要我想学会用ReadDirectoryChangesW再改用多线程..照理说我的代码应该没什么问题.为什么程序会死????就算慢也不至于会死...还有我想知道ReadDirectoryChangesW这个函数的执行原理,我觉得好象它的用时很长....请高手指点...
while (true) {
int ret=ReadDirectoryChangesW(
hand,
&Buffer,
sizeof(Buffer),
TRUE,FILE_NOTIFY_CHANGE_SIZE| FILE_NOTIFY_CHANGE_ATTRIBUTES| FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_FILE_NAME, &BytesReturned,
NULL,
NULL
);
switch(Buffer[0].Action)
{
case FILE_ACTION_ADDED:
tt=CTime::GetCurrentTime();
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
m_list.InsertItem(0,strTT);
m_list.SetItemText(0,3,"添加");
break;
case FILE_ACTION_REMOVED:
tt=CTime::GetCurrentTime();
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
m_list.InsertItem(0,strTT);
m_list.SetItemText(0,3,"添加");
break;
case FILE_ACTION_MODIFIED:
tt=CTime::GetCurrentTime();
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
m_list.InsertItem(0,strTT);
m_list.SetItemText(0,3,"添加");
break;
case FILE_ACTION_RENAMED_OLD_NAME:

tt=CTime::GetCurrentTime();
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
m_list.InsertItem(0,strTT);
m_list.SetItemText(0,3,"添加");
break;
case FILE_ACTION_RENAMED_NEW_NAME:
tt=CTime::GetCurrentTime();
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
m_list.InsertItem(0,strTT);
m_list.SetItemText(0,3,"添加");
break;
}
}
为什么我把整个while循环删除了.也就是让它只执行一次.虽然不死了,但是会有几秒的延迟..这是为什么???
...收起
ReadDirectoryChangesW 有同步和异步2种方式,根据前面打开的文件夹对象句柄决定。 1. 异步方式,如果 CreateFile 指定了打开类型 FILE_FLAG_OVERLAPPED 就是异步方式,ReadDirectoryChangesW 调用的时候就需要指定 OVERLAPPED 参数. 接下来对文件夹I/O变化的响应判断有多种方式。 A通过不断的调用HasOverlappedIoCompleted函数(非阻塞,参数就是前面的OVERLAPPED 对象指针)的返回值来判断是否发生了 关注文件句柄的I/O操作。如果发生变化,再执行你的 switch(Buffer[0].Action) 操作过程。 B GetOver
...全文
要在一个定义器或者多线程里使用ReadDirectoryChangesW 你用while (true),就相当于一个死循环了,Windows其他的消息响应也就停止了,所以你的程序就会死了。 最简单的方式是用定时器的方式 把你的这些代码放在OnTimer中。
...全文