我在用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
);
解决方案 »
- 有办法把蓝色变成红色吗?
- 请教 vb里一个浏览目录的控件 在vc里怎么实现呢
- 关于树控件派生类给控件所在的对话框发送自定义消息的小问题
- 结构体能不能有构造函数?
- CString如何转换成VIARANT型的变量
- 如何判断一个对话框的指针指向哪一个个特定的对话框对象
- CPropertySheet中换页的问题
- 程序呼叫,並且通過我的程序,去響應另外一個被呼叫程序的介面事件...可以實現麼..如何解決?
- 急求mfc有关树形控件问题
- 在给TreeCtrl添加了背景图后引出的新麻烦。。。
- 为什么pic控件的m_pic.GetDC()的区域和m_pic.GetWindowRect(&rec)的区域不同?
- 请问大家讨论,c语言的开发环境
CDirectoryChangeWatcher