目录监控类

项目要用到目录监控的功能,但是下载了几个代码都或多或少有丢失文件名的情况,所以研究了一下,希望能给大家节省些时间。
总结如下
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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值