ring3层实现文件监控 - vc

C/C++代码 blackfeather

 

文件/文件夹监控这个功能在某些项目中会用到,需要的就是监控而不是拦截,所以此代码作用就明显了。博主查找,总结了三种方法实现文件/文件夹监控,注意只是监控。

这里只是点一下关键函数,具体用法不贴出来了,自行搜索。

 

方法一:SHChangeNotifyRegister

Windows内部有两个未公开的函数,不过在最新的MSDN中,已经公开了,分别叫做SHChangeNotifyRegister和 SHChangeNotifyDeregister。这两个函数位于Shell32.dll中,是用序号方式导出的。

SHChangeNotifyRegister可以把指定的窗口添加到系统的消息监视链中,这样窗口就能接收到来自文件系统或者Shell的通知了。而对应的另一个函数,SHChangeNotifyDeregister,则用来取消监视钩挂。 

这个函数主要就是使用方便,掉用一下设置回调函数,然后就等着变动消息自己找上门,处理即可。

 

方法二:ReadDirectoryChangesW

这个函数不仅能够监测到文件系统的变化,还能够返回详细的文件变动的信息,并且能够选择是使用同步方式检测还是异步方式监测,比较全面。对应的,这个函数的使用比较复杂了。

有网友说在文件系统更新很快,很频繁的时候,这个函数会出现漏掉监控信息的情况,这个原因在MSDN里有提到,MSDN里是这么说的:当你第一次调用ReadDirectoryChangesW这个函数的时候,系统会分配一些缓存来存储文件变化信息,这些缓存与要监控的文件夹关联,直到他关闭,并且这些缓存的大小在其生存期间不会改变,调用该函数的时候,文件的变化信息不断添加到这些缓存中,如果缓存溢出,这些改变信息会丢失,函数返回error_notify_enum_dir的错误。不过这个网友贴了一个国外的代码,据说里面解决了这个问题。链接 -> http://www.codeproject.com/Articles/950/CDirectoryChangeWatcher-ReadDirectoryChangesW-all

 

方法三:FindFirstChangeNotification

此函数创建一个改变通知对象,设置初始的改变通知过滤条件。在指定的目录或子目录下,当一个符合过滤条件的改变发生时,一个在通知句柄上的等待将会成功(等待函数返回)。

不贴代码了,各位自己直接搜索示例吧。

 

至于各个函数的优缺点,还没做过测试,等有机会了测试一下补充到这里。

 

 

评论列表:

发表评论: