桌面搜索-目录监控

对于桌面搜索来说,需要随时观察硬盘的中文件是否有变化,对于新增的文件要添加索引,对于删除的文件要删除相应的索引,对于修改,重命名等也需要做相应的处理,这样才能保证我们的桌面搜索引擎总是能够搜索到最新最全的硬盘中的信息。

对于windows操作系统,监控目录的方法一般有下面这些:

1.文件同步

文件同步方法的大致思想是在程序启动时,在内存中建立一棵与硬盘中文件和目录结构一一对于的文件树。并每隔几分钟扫描一次硬盘,对于硬盘中文件或者目录与内存中不符的部分做相应的处理,并更新文件树。对于象桌面搜索这里的应用来说,并不需要时时,所以几分钟同步一次问题不是很大。然而在同步效率方面,由于要遍历硬盘上的所有文件,消耗的时间还是很大的。我做测试的硬盘有80G,一共有60000多个目录和4000多个目录,遍历一次硬盘的时间大概需要1秒多的时间,如果文件更多的话,就很难接受了。

至于改进的办法,我想可以从2方面来进行。

一个是降低遍历线程的优先级,就是花更多的时间遍历,但是不影响系统别的进行的运行,现在我一遍历,硬盘就嗞嗞做响。

另外一个方法是只遍历关心的文件,由于桌面搜索只是对部分格式的文件做全文检索,其他只要检索文件名就可以了。所以我们在遍历是只搜索特殊后缀的文件,不过这个可能对性能的提高不会有太多的影响。

2.虚拟设备驱动(VXD)编程

设备驱动编程是指让工作于系统核心态的驱动程序去拦截所有的文件访问。这种方法时时性高,但是风险很大,由于设备驱动编程需要进入ring0权限,所以将很容易导致蓝屏死机(BSOD),Ring0下的异常将往往导致系统崩溃,因为它对于系统总是被信任的,所以没有相应处理代码去捕获这个异常。另外实现相对复杂很多,所以除了杀毒软件采用这种方式以外,其他很少有用到这种方式监控目录的。

3.Windows API

windows API方式主要采用windows提供的api接口来完成对目录的监控,实现相对简单。我们的桌面搜索引擎也准备采用这种模式来实现。

Windows里面对目录、文件监控提供了两个API,它们分别是:FindFirstChangeNotificationReadDirectoryChangesW。这两个API都可以对目录进行时时监控。

但是非常不幸的,他们都有自己的缺点(要是没有缺点的话杀毒软件也不会费那么大力,冒那么大风险用设备驱动编程方式了)。首先说FindFirstChangeNotification,这个API最大的问题是告诉你了某个目录有变化,但是却不告诉你变化在哪里,简直是让人吐血。在桌面搜索中,一般是对系统的分区进行监控的,你告诉我C:发生了变化,其实一点用都没有,我还是要把C:全部搜索一遍。当然FindFirstChangeNotification也可以不对子目录进行监控,我测试了一下,对6000多个目录全部建立的监控(当然是一个线程),结果发现监控失败,最终测试结果是FindFirstChangeNotification最多只支持监控64个目录。所以只好放弃了。

ReadDirectoryChangesW到是对上面的这些非常支持,简直说是完美无缺,不仅告诉你哪个文件改变了,是大小改变还是被修改或者创建删除重命名都给你分的轻轻楚楚,但是只支持2000及以上的windows版本。真是无奈啊,所以我们的桌面搜索引擎只好只支持2000及以上版本了。

最后,我觉得第一种方法虽然速度慢,但是还有改进的余地,如果有时间的话我会再尝试的。如果大家有什么好的方法,也希望多多指教。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值