在VS2013下模拟实现了类似Everything的文件快速搜索功能,支持模糊匹配,高亮显示搜索部分。

1、首先在linux下有find命令,找一个文件是非常快的。

2、在windows下,查找是比较慢的,可以说是很慢的了,所以就想自己实现一个

3、使用everything搜索,效率很明显快乐很多

使用windows下的搜索是非常慢的,并且不支持拼音搜索和拼音首字母搜索。所以自己实现了一个有这些功能的快速搜索工具。用到了SQLite,是一个轻量级的数据库,因为安装在本地就可以工作,而MySQL是C-S模型的,还需要连接服务器,我们只是在本地进行搜索,不需要上传到服务器中,或者跨电脑搜索,没有必要。

实现流程:

1、数据库的操作:打开数据库,建表,实行SQL语句。因为在结束搜索任务的时候,因为表是用到了单例模式,为了避免忘记释放操作数据表的对象,用了RAII的思想,智能管理表的释放(类似Unique_ptr)。

对于存储文件名和位置的表来说,实际在我们使用中只需要使用到一份表格,所以用到了单例模式(饿汉)。因为要支持拼音搜索和拼音首字母搜索,所以建表是就把文件的相关信息存到表中。

2、遍历指定文件夹:在这个文件夹下,有可能有文件和文件夹,所以需要两个容器来存储,遍历时需要注意,一个文件夹内默认包含了当前(.)和上一层(..),所以遇到不再遍历当前和上层,否则会有死循环。用存储放到表中的,用存放本地的文件。因为set是有序的,所以两者比较起来就很方便。

3、每遇到一个文件,和表中数据对比,没有就放到表中去:;本地没有,表中有就需要删除:并且开启搜索任务,若是遇到本地文件的增删,数据库中数据应该具有实时性,所以,开启扫描的线程每5秒扫描一次,更新数据库中的数据。

4、搜索模块:是这个项目中的核心任务了。因为要支持汉字、拼音、首字母搜索,所以在网上找了汉字对应拼音、首字母的代码段(没有生僻字)和控制字符串高亮的代码段。输入拼音,根据表中的拼音成员返回文件名。难点就在于输入拼音和首字母,怎么高亮对应的中文。

void DataManager::SplitHighlight(const string& str, const string& key, string& prefix, string& highlight, string& suffix)//切割高亮部分
{//汉字直接匹配{size_t ht_start = str.find(key);if (ht_start != string::npos){prefix = str.substr(0, ht_start);highlight = key;//高亮部分suffix = str.substr(ht_start + key.size(), string::npos);return;}}//拼音全拼匹配{string str_allspell = ChineseConvertPinYinAllSpell(str);//文件名转为拼音string key_allspell = ChineseConvertPinYinAllSpell(key);//中英结合搜size_t ht_index = 0;//size_t allspell_index = 0;size_t ht_start = 0, ht_len = 0;//ht_start控制中文名高亮部分size_t allspell_start = str_allspell.find(key);if (allspell_start != string::npos){size_t allspell_end = allspell_start + key_allspell.size();while (allspell_index < allspell_end){//检测是何时开始高亮if (allspell_index == allspell_start)//start是指文件全拼中key的其实位置{ht_start = ht_index;//对应汉字的位置}//如果是ASCII字符,跳过if (str[ht_index] >= 0 && str[ht_index] <= 127){++ht_index;++allspell_index;}else//跳汉字,手机图,因为GBK下一个汉字2个字节{char chinses[3] = { '\0' };chinses[0] = str[ht_index];chinses[1] = str[ht_index + 1];string ap_str = ChineseConvertPinYinAllSpell(chinses);//中文文件名ht_index向后跳。因为GBK下一个汉字2个字节,跳一个汉字的长度ht_index += 2;//文件全拼指向allspell_index全拼跳过汉字的拼音长度allspell_index += ap_str.size();}}ht_len = ht_index - ht_start;prefix = str.substr(0, ht_start);highlight = str.substr(ht_start, ht_len);suffix = str.substr(ht_start + ht_len, string::npos);return;}}//拼音首字母{string ial_str = ChineseConvertPinYinInitials(str);string ial_key = ChineseConvertPinYinInitials(key);size_t ial_strat = ial_str.find(key);if (ial_strat != string::npos){size_t ial_end = ial_strat + ial_key.size();size_t ial_index = 0 , ht_index = 0;size_t ht_start = 0, ht_len = 0;while (ial_index < ial_end){if (ial_index == ial_strat){ht_start = ht_index;}//asciiif (str[ht_index] >= 0 && str[ht_index] <= 127){++ht_index;++ial_index;}else{ht_index += 2;++ial_index;}}ht_len = ht_index - ht_start;prefix = str.substr(0, ht_start);highlight = str.substr(ht_start, ht_len);suffix = str.substr(ht_start + ht_len, string::npos);return;}}//TRACE_LOG("split Highlight no match. str:%s, key:%s\n", str.c_str(), key.c_str());prefix = str;
}

来看一下:刚开始

  • 因为最先遇到是“C++”,所以执行以下代码:

  • 后面是汉字,因为还没有走到的位置,所以执行以下代码:

将ht_index和ht_index+1对应汉字“强”,GBK下一个汉字两个字节。所以allspell_index向后跳“强”对应拼音的字节数

  • 直到allspell_index和allspell_start相等,执行以下代码,找到中文文件名开始高亮的位置,拼音高亮核心就已经搞定了。

  • 最后,控制条件,可以找到高亮结尾的地方。

剩下的首字母高亮汉字,就简单的多了,将文件名的汉字转为首字母拼写,控制原理和上面的一样。

VS实现文件的快速搜索相关推荐

  1. win10系统通过文件名称快速搜索文件的软件

    描述:win10系统通过文件名称快速搜索文件的软件 介绍:everything,可以实现通过文件名称快速搜索文件

  2. 快速搜索NAS文件、快速搜索共享文件、使用everything搜索实现。

    需求:共享的文件里面,文件大概有十几万个.目前需要快速的搜索共享文件里面的文件. 环境:win10/win7,64位系统 使用软件:目前在官网下载的最新版本Everything 1.4.1.895.注 ...

  3. 项目 - 文档快速搜索工具

    一.项目简介: Linux操作系统中提供了find指令查找指定文件,为了实现在Windows操作系统中实现文件的快搜搜索,利用所学知识实现文件搜索工具,与软件everything工具具有一定的相同功能 ...

  4. 计算机查找文件的速度,如何快速搜索文件_怎么加快电脑里的文件搜索速度

    2019-11-01 10:40:56 浏览量:261 现在电脑的硬盘容量越来越大了,里面的内容也随之变多,所以当我们想要找到某个文件的时候也会变得很麻烦.特别是有些时间比较久了的,更加困难.那有网友 ...

  5. 安卓手机管理器_电脑文件快速搜索有everything,那手机呢?

    对于那些经常使用电脑和办公的人来说,肯定免不了查找文件,电脑自带的文件搜索根本满足不了需求,因为文件实在太多了,所以第三方文件搜索工具everything就诞生了,并且成为了win10必备的软件,ev ...

  6. linux之用 grep -r 关键字 快速搜索在目录下面的含有关键字的文件

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程 1.快速搜索在目录下面的含有关键字的文件 我们采用下面命令 cd directoriesgrep -r ...

  7. 怎么快速搜索服务器里的文件,使用 Everything,快速搜索电脑文件,制作局域网资料搜索器 | 科技搜...

    所需工具:Everything 在 Windows 系统中,已经有自带的资源管理器文件查找功用,当然也有其他的一些软件辅佐查找,但是这些都不及一款软件,名字叫 Everything ,速度非常快,支持 ...

  8. 【分享-windows文件快速搜索神器】Everything 免费、快速搜索文件/文件夹

    windows文件快速搜索神器 - Everything 下载:https://www.voidtools.com/ 先来体验一波 windows自带的搜索如下,等了一分钟还没搜索完: Everyth ...

  9. 用计算机查找文件地址吗,如何快速搜索电脑里的文件( 快速准确定位和查找电脑文件位置的方法...

    今天给大家带来如何快速搜索电脑里的文件(,快速准确定位和查找电脑文件位置的方法,让您轻松解决问题. 怎样快速搜索电脑里的文件 如何快速准确定位和查找电脑文件位.我们在使用电脑的时候,经常需要进行一些操 ...

最新文章

  1. java ee 修改_java ee 在数据库中执行增删改查
  2. python培训中心-【北京Python培训中心】
  3. java web开发中Filter使用Annotation配置 (转载)
  4. 计算机模块怎么算,计算基础
  5. 易创课堂深圳干货,趁热下载
  6. mycat mysql端口多少_mycat 9066管理端口 常用命令
  7. 为了防止程序重排序,慎用volatile
  8. javascript Array类型 方法大全
  9. scrapy middlewares.py
  10. 详解MariaDB数据库的事务
  11. oracle xsql 详解(一)
  12. if __name__ == __main___一文搞懂 if __name__ == #39;__main__#39;
  13. 红盟云卡-开源的发卡网源码
  14. 上海科技大学信息科学与技术学院夏令营
  15. 关于本学期学计算机基础专业的收获,大学生计算机基础学期总结-20210420001228.docx-原创力文档...
  16. VVIC搜款网平台API接口
  17. 新生活、新成长、新认知
  18. 通过爬虫获取第五人格游戏信息整理并分析(一)
  19. 计算机打印状态错误,打印机出现错误状态是怎么回事,教您解决办法
  20. L0,L1,L2正则化浅析

热门文章

  1. python之实例分析
  2. FISCO BCOS将于4月完成BSN适配并开启公测 | 附BSN开发者大赛作品下载
  3. 企业邮箱为什么收不到邮件?企业邮箱邮件收不到验证邮件?
  4. Andorid Studio中运行模拟器--夜神模拟器
  5. vim filetype
  6. 微博成互联网普遍应用
  7. Flowable全局监听器-待办消息提醒
  8. python 大智慧股票行情数据_Python获取股票历史数据和收盘数据的代码实现
  9. Windows7注册表优化设置合集
  10. 微信公众号认证开具深圳电子普通发票查询方法。