项目要用到目录监控的功能,但是下载了几个代码都或多或少有丢失文件名的情况,所以研究了一下,希望能给大家节省些时间。
总结如下
1,调试过程中发现在处理ReadDirectoryChangesW的时候,如果后续处理耗时少,那么能够得到大部分甚至全部的内容后续处理耗时的话就会丢失,猜想可能windows本身提供了一个很小的缓冲,如果不持续调用ReadDirectoryChangesW的话,宝贵的数据就会被系统无情的抛弃,这就是所谓丢失现象,
2,根据typedef struct _FILE_NOTIFY_INFORMATION {
DWORD NextEntryOffset;
DWORD Action;
DWORD FileNameLength;
WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
我们可以知道,这显然是个类链表的结构也就是这里有可能存储一系列的结果(如果一次只存一个结果显然系统很难设计),那么我们就要根据NextEntryOffset偏移将所有的数据都得到,这样才能防止数据丢失
3, ReadDirectoryChangesW(//这里的BUFSIZE不要申请的太少,否则会因为系统堆积缓冲太多而不够用
m_hDir,
m_pBuf,
BUFSIZE,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_CREATION |
FILE_NOTIFY_CHANGE_SIZE,
&dwBytesReturned,
NULL,
NULL);
根据上述发现,特设计了一个双线程结构,其中用到了代码库中的类,lg_LoopBuffer在这里用并不合适,但用于测试,以及验证结果,暂时就将就用了。代码写的很粗糙,会根据反映逐步修改.
至于完成端口的方法我想原理应该和这个差不多,有兴趣的可以自己试一下.
另外如果对代码有什么想法欢迎讨论,大家的支持是我的动力!
http://blog.vckbase.com/longest/archive/2006/05/24/20296.html