我在用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的创建方法在下面
¬ify,
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
);
为什么?线程函数如下: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的创建方法在下面
¬ify,
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
);
解决方案 »
- 有关SetWindowOrgEx的问题
- SERVER 2000 连接问题 用ADO
- 最近要做一个界面
- 请教:怎样Microsoft Forms 2.0 ListBox控件列头设标题,非常感谢!
- 这个矩阵类求逆的代码是不是有问题!
- 我的扩展DLL只能发行Debug,有经验的朋友帮忙看看(up也有分)
- 程序窗口上的图标如何换成自己想要的?
- UpdateData函数还需要声明吗?
- GeForce4 MX440是否支持VertexShader 2.0?
- coblist ,cptrlist,cstringlist 有什么区别?
- 请问有什么简单的方法改变字体的大小?
- 为什么pic控件的m_pic.GetDC()的区域和m_pic.GetWindowRect(&rec)的区域不同?
除非使用更底层的东西来来钩住文件操作。像filemon这类的。
http://www.sysinternals.com/ntw2k/source/filemon.shtml
但是是98的。