简陋,山寨,Everything,桌面搜索,原理,源码

出处:http://hi.baidu.com/chenxiong0115/blog/item/b31e573a3d8bd6e715cecbb6.html

  前些时间对Everything很感兴趣,花了差不多一个月浅尝NTFS文件系统,
并做了些Everything算法方面的实验,开发了一个简易版 仿Everything搜
索工具。还没写正则和网络部分。

    在文件搜索算法速度上不比Everything慢,之所以看上去是一条一条显示,
是因为为了简化显示结果的代码,仅采用了listctrl 的Virtual list。

    为了和广大程序开发者多交流,向大家学习,弥补自己的种种不足,我将
自己学习研究,开发出的这份代码公开。

    说来惭愧,花了差不多一个多月写出的这份代码参加腾讯公司的校园之星
创新大赛,结果被鄙视了 :-)

    程序正式说明如下:

【功能说明】
    相关定义:
        (1)短文件名:全文件名的非路径部分,全文件名的最后一个'/'之后的部分
        (2)主文件名:短文件名的非扩展名部分,不包含扩展名之前的'.'

    1.文件名即时搜索,在第一次使用时需要等待程序扫描全盘NTFS卷,以便建立索引文件数据库,在随后使用中无须等待。(也有例外,如果在程序退出后,NTFS卷更改日志过期,仍需要重新扫描数据库才可不漏掉任何文件。Everything的做法是一旦某卷过期,全盘重扫,但是往往用户需要搜索的文件在不重扫时也能找到,本插件在此情况下告诉用户上次保存数据库的日期,让用户判断是否有必要重扫,增强了用户体验)。另外,在程序运行中能对NTFS文件系统的改变进行实时监视,即时显示监视中满足输入条件的文件结果。

    2.提供了主文件名搜索框和扩展名搜索框,使得搜索结果更加准确,用户更易于理解如何搜。
例如:如果用户想搜索主文件名中含有proj的文件,Everything搜索中会搜出扩展名部分含有proj的文件;又如用户想搜索含有.m扩展名的文件,但是结果中出现了很多含.m的文件夹。这些都相当不利于用户体验。本程序将此二者分开,两个输入框使用tab建快速切换,相当便捷。

    3.主文件名搜索规则多个输入关键词以空格隔开,满足此且运算的文件将会显示在结果中。即结果中的文件必须同时满足所有输入关键词。

    4.扩展名搜索规则多个输入扩展名以空格隔开,满足此或运算的扩展名的文件将会显示在结果中。即结果中只会显示扩展名在输入框中出现的文件。另外用户输入扩展名时不会搜索到文件夹。

    5.主文件名部分支持通配符? *搜索

    6.搜索结果整体按照UNICODE码值排序,对中文部分按照汉语拼音排序。方便用户查找结果。而Everything仅按照UNICODE排序。

    7.保留设置字母大小写菜单,增加两个菜单项[搜索文件][搜索文件夹]。
    具体地,
        当两者都勾选,结果中即有文件夹,又有文件;
        当仅勾选[搜索文件]时,结果中不会出现文件夹;
        仅勾选[搜索文件夹]时,结果中不会出现文件。
    另外,点击菜单可即时修改结果页面,相当方便。

    8.增加所在目录设置。考虑到用户普遍需求仅搜索某(几)个卷或者某(几)个文件夹下的文件。本程序还考虑了是否包含子目录情形。另外,对所在目录的设置可以即时修改结果页面,操作方便,用户体验效果佳。

    9.增加对结果页面按文件大小、文件(夹)日期、文件(夹)属性三种过滤模式。(由于此三类信息都没有在内存中存储,过滤操作较耗时,因此,需要用户点击过滤按钮进行过滤。当含有较多结果时会提示用户是否继续进行过滤)

    10.对结果列表的操作,可使用右键弹出文件的系统菜单,可双击文件运行文件。增加选中整行,以便用户查看文件大小等属性信息。增加双击打开所在目录文件夹功能。

    11.Everything不支持长文件名,其最长文件名仅支持256字节的UTF8编码文件名。本程序突破了这一限制,能搜索到系统中所有的文件名。

【当前版本与Everything相比未提供的功能】
     1.不支持主文件名正则匹配
     2.主文件名不支持或运算
     3.不支持网络分享


【性能比较】
     1.内存使用
         由于本程序较Everything而言,每个文件多出4字节用户存储文件名ID,是用来支持属性的快速显示和文件过滤功能,再加上改进Everything不支持长文件名的Bug也增加了内存消耗,致使程序内存占用比Everything稍多。

     2.数据库容量
         当前版本的文件名数据库容量比Everything大,其原因包括:(1)每个文件多出4字节用户存储文件名ID;(2)改进Everything不支持长文件名的Bug;(3)文件名压缩仅采用了前缀压缩,而未使用bzip2算法进行二次压缩。

     3.显示结果速度
         本程序搜索速度和Everything的搜索速度相比不相上下。但是由于本程序中显示结果采用了Owner Data列表控件,而Everything没有使用Owner Data列表控件,致使其显示结果的速度可能较Everything稍慢。显示结果的速度瓶颈在于显示文件的ICON,以及文件的大小、日期、属性,每个文件需要访问磁盘获取相关信息。具体表现于,本程序采用Owner Data列表控件,其效果是搜索结果先完整显示第一个文件的文件名、所在目录、ICON、大小、日期、属性等信息之后再完整显示下一条结果。而Everything的做法是先完整显示 文件名 所在目录 扩展名 3列,然后对其他列一行接一行显示,这样用户看起来觉得Everything搜索更快,实则不然。本程序在显示结果方面,对列表控件的处理有待进一步改进。

 

这个图片是界面截图,也是【源代码的链接】。

鼠标右键“目标另存为”(而不是“图片另存为”)下载该图片 然后把下载的文件名扩展名从jpg改为rar 打开即可。

原文地址:https://www.cnblogs.com/marryZhan/p/2213939.html