C++实现文件搜索小工具
文件快速定位器:可支持 1) 文件名(全部汉字或部分汉字),2) 文件名拼音,3) 文件名首字母,4)汉字和拼音, 汉字和首字母混在一起的搜索。 功能:输入要搜索文件,在终端上显示出相匹配的文件名和文件所在路径。
一、项目背景
背景:Linux环境下有find命令,用来查找文件便捷高效,而windows下文件框的默认搜索是搜索时再进行暴力查找,非常的慢,不能进行全局搜索,对于长时间不用记不清名字的文件来说,查找非常困难。
因此此文中的文件快速定位器是在搜索软件Everything的基础上结合QQ,百度等搜索工具的部分功能的基础上来实现的。
调查:如下图everything搜索软件界面和实现功能,它将文档信息检索以后,先存到数据库,查找时在数据库进行搜索,速度就快了很多(数据库中文件存储的底层数据结构为红黑树或者哈希表),软件实现了按文件名关键字的查找。
而QQ等软件中的搜索可支持汉字搜索,拼音搜索,首字母搜索,并做到关键字高亮处理。
实现:
文件快速定位器:在windows下实现指定路径下文件的汉字搜索、拼音搜索、首字母搜索并高亮显示搜索出来的关键字。即:在输入要查找的文件关键字,在终端上打印出包含关键字的文件名和文件路径,并高亮显示关键字。
汉字搜索:第二次课
拼音搜索:diercike
首字母搜索: DECK
二、项目框架
1.数据扫描模块(扫描+监控)
1)扫描:获取指定路径下的所有文档
把给定路径下的文档的名称的路径扫描出来,放到容器里面等待处理。
使用C语言下#include <io.h>中的接口_findfirst _findnext来查找文件,_findfirst _findnext的使用方法、接口参数设置和返回值详细参考博文:https://blog.csdn.net/damant/article/details/50833845
2)监控:本地与数据库文件对比
2.数据持久化
1)数据库使用
使用轻量级的数据库sqlit 3,数据库简介 https://www.runoob.com/sqlite/sqlite-intro.html
数据库官网:https://www.sqlite.org/index.html
数据库的打开、关闭、创建表格、SQL语句执行
创建一张供搜索用的表即可
2)数据管理
数据库初始化、建表、增加或删除数据
3.搜索
汉字、拼音和首字母搜索。采用数据库Like语句实现模糊匹配检索。
高亮显示。自主实现高亮算法
4.其他套用模块
trace日志模块(记录错误,找到出错点 返回错误码)
高亮打印一段字符串
汉字转拼音全拼(UTF-8)
汉字转拼音首字母(UTF-8)
三、数据扫描模块
1.扫描指定路径下文件(_findfirst _findnext)
2.扫描模块管理
扫描模块设定成单例模式,使整个项目只有一个扫描模块,线程持续重复扫描指定目录。
扫描模块具体实现
把本地和数据库中的文件信息放入set(自动排序)里面,根据两个set里的数据迭代器对比,本地有数据库没有,数据库新增数据;本地没有数据库有,数据库删除数据; 递归对比所有子目录下的文件。
四、数据持久化
把数据放入数据库(本项目选用轻量级数据库sqlite 3),在数据库的基础上处理数据。
1.数据库的使用
1)添加外部库文件(sqlite 3)
使用外部编辑下载好的sqlite3.h文件
首先,把库文件放到工程目录下,然后,在VS 2013工程下的解决方案资源管理器中 ->工程名 -> 属性 -> 链接器/常规 -> 附加库目录(添加外部库的路径) -> 点击输入项 -> 附加依赖项(添加上sqlite3.h文件)。
操作数据库:
实现数据库的打开、执行、关闭。 使用RAII来主动创建数据库,并free数据库,避免出现没存泄露。
2.数据库数据管理
数据库中数据的管理包括:数据库初始化(打开),获取数据库中的数据,数据库中插入删除数据,关键字搜索,关键字高亮。
设计成单例模式,保证同一时间只进行几次数据库操作,防止数据丢失或多余。
五、关键字搜索高亮处理
1.关键字搜索
包括:汉字搜索、汉字拼音全拼搜索、汉字拼音首字母搜索。
使用SQL语句中的like模糊匹配功能实现: 由于编译环境和windows系统都 采用UTF-8中文编码,与数据库编码方式不同,所以汉字存入数据库中换出现乱码现象,而编码转换过于复杂,因此,此处搜索部分对汉字的搜索都通过把汉字转换成汉字全拼或拼音首字母来进行like模糊匹配。
搜索实现代码如下:
2.关键字高亮
对一串字符串中的某段关键字字符串高亮显示,实现高亮算法,并借助高亮实现函数来实现。
1)针对查找关键字为汉字的高亮
2)针对查找关键字为汉字的拼音全拼的高亮
算法具体实现:
3)针对查找关键字为汉字的拼音全拼的首字母的高亮
算法具体实现:
六、套用模块
1.trace日志:
2.高亮打印一段字符串str
3.汉字转拼音全拼
4.汉字转拼音首字母
七、项目总结及日后完善点
1.项目开发工具:VS2013
测试平台:windows 10
2.功能:实现通过输出关键字,来查找指定目录下的所有含关键字的文件名,并最终在终端上打印出文件名和路径,此处支持汉字搜索、汉字拼音全拼搜索、汉字拼音首字母搜索,并在搜索出的文件名中高亮显示关键字。
3.项目开发模块:扫描(文件扫描和监控)模块、数据库管理模块、搜索模块、高亮显示算法模块、汉字转拼音、汉字转首字母模块、trace日志等。
4.项目开发亮点:sqlite3使用、采用RAII操作数据库、单例模式、高亮匹配算法、C++11的thread/mutex使用。
5.项目的不足:1)扫描大目录时,效率低,导致实际数据和搜索数据不一致。2)由于编码问题,使用拼音模糊搜索,搜索时出现小bug,搜索结果出现问题。
6.项目改进:对大目录进行多线程分片扫描,并加入监控模块。 解决编码问题。 多次测试使搜索结果更加准确等。
八、项目完整代码
此处附上GitHub代码链接,需要参考的伙伴,可以去看看。