讨论:FindNextFile的实现 及 “搜索缓存”
我们都有这么一个体验:用windows的资源管理器在“我的电脑”里查找一个文件,第一次可能会耗费相当长的时间,但如果刚查找玩A文件,我们马上接着在同样的范围内查找B文件的话,这时候会发现,速度快了很多很多,可能前面用了一分钟,后面只用了几秒钟,甚至更少。两者的区别,我们明显能感觉到,第一次是真实的查找,你会发觉硬盘“ga zi ga zi”作响,(如果你的硬盘不够好的话^_^),第二次明显不是真实的查找,硬盘貌似没动作。
自己写文件遍历,你会发现也是这样的。(使用FindFirstFile/FindNextFile函数)
如果你在使用自己的遍历程序之前,对目标范围进行一次用资源管理器的search操作,你会惊奇发现,你的遍历程序也快得惊人。
这说明内部有个缓存,但这个缓存并非永久保留,过了10来分钟(大约),你再重新search,速度又变为慢速了,这时候磁盘也恢复“ga zi ga zi”的响声。
另外:不知道你是否查看过IE的缓存,这个缓存在我的电脑上是这个目录:
C:\Documents and Settings\guogangj\Local Settings\Temporary Internet Files\Content.IE5
之下还有一些子目录,第一次打开这些子目录需要耗费大量的时间,打开完毕之后你会发现其实文件没有预料中的多,之后再访问这些目录就很快了,这明显也使用了缓存,只是我不太明白为什么第一次会这么慢。当然这个问题是次要的了。
我不得不佩服微软的细心,所以开这个帖子来讨论一下FindNextFile的内部实现,如果我们以后需要类似的功能,如何来实现这个“缓存”。