我在用ReadDirectoryChangesW来监视一个目录中文件的变化时发现,如果这个目录里的文件变化很快,ReadDirectoryChangesW()会丢掉相当大的一部分变化通知。
为什么?线程函数如下:DWORD WINAPI UpdateThread(LPVOID lpParameter)
{
THREAD_PARAM *Par=(THREAD_PARAM *)lpParameter;
char notify[1024];
FILE_NOTIFY_INFORMATION *pnotify=(FILE_NOTIFY_INFORMATION *)notify;
DWORD cbBytes;
while(true)
{
if(ReadDirectoryChangesW(Par->hDir, //Par->hDir的创建方法在下面
&notify,
sizeof(notify),
true,
FILE_NOTIFY_CHANGE_LAST_WRITE,
&cbBytes,
NULL,
NULL))
{
//当目录中文件变化频繁时,只有一部分变化能被ReadDirectoryChangesW()得到,即并非所有的文件变化都能执行到这里
//但当文件变化不是很频繁时,所有的变化都可以捕获的到。
char AnsiChar[1024];
if(FILE_ACTION_MODIFIED == pnotify->Action)
{
ZeroMemory(AnsiChar,1024);
WideCharToMultiByte(CP_ACP,0,pnotify->FileName,pnotify->FileNameLength/2,AnsiChar,1024,NULL,NULL);
}
}
}
}
//
m_Par.hDir = CreateFile(
m_Par.dir, 
FILE_LIST_DIRECTORY, // access (read/write) mode
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE, // share mode
NULL, // security descriptor
OPEN_EXISTING, // how to create
FILE_FLAG_BACKUP_SEMANTICS, // file attributes
NULL // file with attributes to copy
);

解决方案 »

  1.   

    有多频繁?要是果真如此,估计也没什么办法,你那个程序已经是MSDN中的例子了。
    除非使用更底层的东西来来钩住文件操作。像filemon这类的。
    http://www.sysinternals.com/ntw2k/source/filemon.shtml
      

  2.   

    http://www.codeguru.com/system/spy_fileio.shtml
    但是是98的。
      

  3.   

    我在codeproject上找了个类,他是用完成端口的,我估计问题应该跟这有关。我用了他的的类问题解决了。