ReadDirectoryChangesW监视文件夹内的资料变化情况

ReadDirectoryChangesW监视文件夹内的文件变化情况
char notify[1024];  
memset(notify,'\0',1024);  
FILE_NOTIFY_INFORMATION *in_out_notification=(FILE_NOTIFY_INFORMATION *)notify; 
DWORD in_MemorySize = 1024;
DWORD *in_out_BytesReturned = new DWORD;  
HANDLE handle_directory=CreateFile("D:\\苗", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);
if(handle_directory==INVALID_HANDLE_VALUE)  
{
DWORD ERROR_DIR=GetLastError();
AfxMessageBox("打开文件目录失败!!");
}
BOOL watch_state;
int num = 0;
string str = "";
CString temp = _T("");
LPOVERLAPPED lpOverlapped = new OVERLAPPED;
LPDWORD lpNumberOfBytesTransferred = new DWORD;
while (TRUE)
{
watch_state = ReadDirectoryChangesW(handle_directory,(LPVOID)in_out_notification,  
in_MemorySize,  
TRUE,  
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE,
(LPDWORD)in_out_BytesReturned,  
NULL,  
NULL);
string file_name;  
DWORD length=WideCharToMultiByte(0,0,in_out_notification->FileName,-1,NULL,0,NULL,NULL);  
PSTR ps=new CHAR[length];  
if(length>=0)  
{  
WideCharToMultiByte(0,0,in_out_notification->FileName,-1,ps,length,NULL,NULL);  
file_name=string(ps);  
delete[] ps;  

if (GetLastError()==ERROR_INVALID_FUNCTION)  
{  
AfxMessageBox("系统不支持!");  
}  
else if(watch_state==0)  
{  
AfxMessageBox("监控失败!");  
}  
else if (GetLastError()==ERROR_NOTIFY_ENUM_DIR)  
{  
AfxMessageBox("内存溢出!");  
}
memset(notify,'\0',1024);
}

这是我根据网上写的一段关于监视制定目录下面的文件的变化情况的,我们假设这个制定的目录为A,这个函数可以很好的监视A目录里面的文件的修改,删除等等,但是对于文件或者文件名的修改不能很好的监视,如果是A根目录下面的文件的文字被修改了,我们可以监视到修改前和修改后的文件名,但是对于A下面的子目录我们就不能很好的监视了,只能监视到修改前的文件名而得不到修改后的文件名,还有对于A下面的文件夹的名字的修改也只能监视到文件夹修改前的名字而监视不到文件夹修改后的文件,请大虾来赐教!
监视子文件夹名字修改 监视文件名字修改

------解决方案--------------------
引用:
Quote: 引用:

1,注意ReadDirectoryChangesW只是能检测到调用此函数的之后的第一个文件改变,当然如果改变很频繁(特别是删除操作),那么可能几个变化会粘在一起,接收到的数据长度非常长,读完第一个需要继续解析FILE_NOTIFY_INFORMATION 指针。
2,并且正如上句所说,每次函数调用只能获取一次数据,如果2次ReadDirectoryChangesW的间隔很大的话,就会丢失数据,所以不要在2次ReadDirectoryChangesW做耗时的操作,但这也无法避免数据丢失。最好的方法就是用重叠IO或者IOCP,只要先投递100个(具体数量视你的需求而定,机器cpu越垃圾,2次间的操作越多,则需要投递的越多),那么只要在2次ReadDirectoryChangesW间的改变消息少于100个,就完全不会丢失。


你帮我看看我提出的两个问题怎么解决呢?


不是写了解决方案么,1是解析FILE_NOTIFY_INFORMATION 指针,2是用重叠IO或者IOCP。自己去网上查吧,源代码很多的。