欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Windows 文件检索工具

程序员文章站 2022-05-07 19:09:13
Windows 文件检索工具开发工具开发工具:VS2017,sqlite3项目功能1.支持文档普通搜索2.支持拼音全拼搜索3.支持拼音首字母搜索4.支持搜索关键字高亮项目简介利用 sqlite3 数据库动态保存Windows磁盘下的文件信息( Windows下获得文件信息的结构体_finddata_t),并利用 sqlite3的 selec t 方法来查找数据库中所保存的数据,以此达到快速查找文件的功能。项目中使用了 set 容器(底层为红黑树,查找和插入的效率比较高)来记录本地数据与数...

Windows 文件检索工具

开发工具

开发工具:VS2017,sqlite3

项目功能

1.支持文档普通搜索
2.支持拼音全拼搜索
3.支持拼音首字母搜索
4.支持搜索关键字高亮

项目简介

利用 sqlite3 数据库动态保存Windows磁盘下的文件信息( Windows下获得文件信息的结构体_finddata_t),并利用 sqlite3的 selec t 方法来查找数据库中所保存的数据,以此达到快速查找文件的功能。项目中使用了 set 容器
(底层为红黑树,查找和插入的效率比较高)来记录本地数据与数据库的数据,将两者数据对比并更新数据库中的数据以此来完成文件的实时查找(使用了多线程编程以提高查找效率及扫描效率)。

项目模块

总体设计
Windows 文件检索工具

数据处理模块
主要是对数据库进行管理(提供数据库的增删查改功能),并对数据库中的数据进行处理。将磁盘上的文件信息导入数据库,使用数据库的对外接口来查找我们所输入的文件名(通过数据库模糊查找命令,可以进行文件名的模糊匹配,本模块并不对数据库进行修改)。
以下是本模块的一些方法

class sqliteManager
{
public:
	sqliteManager():m_db(nullptr)
	{}
	~sqliteManager()
	{
		Close();
	}
	void Open(const std::string& path);
	void Close();
	void ExecuteSql(const std::string& sql);
	void GetTable(const std::string& sql, int& row, int& col, char**&ppRet);
	sqliteManager(const sqliteManager&) = delete;
	sqliteManager& operator=(const sqliteManager&) = delete;
private:
	sqlite3 * m_db;
};
class DataManager
{
public:
	~DataManager()
	{
		_dbmgr.Close();
	}
	static DataManager& GetInstance()
	{
		static DataManager inst;
		return inst;
	}
	void Init();
	void GetDocs(const string &path, multiset<string> &docs);
	void InsertDoc(const string &path, const string &doc);
	void DeleteDoc(const std::string path, std::string doc);
	void Search(const std::string& key,
		std::vector<std::pair<std::string, std::string>>& doc_paths);
	static void SplitHighlight(const std::string& str, const
		std::string& key,
		std::string& prefix, std::string& highlight, std::string&suffix);
private:
	DataManager()
	{
		// 打开数据库
		_dbmgr.Open(DOC_DB);
		Init();
	}
	DataManager(const DataManager&) = delete;
	sqliteManager _dbmgr;
	//mutex _mtx;
};


class AutoGetResultTable
{
public:
	AutoGetResultTable(sqliteManager *db, const string &sql, int &row, int &col, char **&ppRet);
	~AutoGetResultTable();
public:
	AutoGetResultTable(const AutoGetResultTable &) = delete;
	AutoGetResultTable& operator=(const AutoGetResultTable &) = delete;
private:
	sqliteManager * m_db;
	char          **m_ppRet;
};

系统扫描模块
本模块中使用了多线程编程,使用了线程分离,由于其他模块并不对数据库进行更改,所以不需要增加互斥锁。在数据库和本地之间使用了set容器(底层为红黑树经过了排序,在后续的对照判断效率会更高)来保存双方的文件信息,让两者数据进行对照,以此来达到更新数据库文件信息和实时查找的目的。

class ScanManager
{
public:
	static ScanManager& CreateInstance(const string &path);
	void ScanDirectory(const string &path);
	void StartScan(const string &path);
private:
	ScanManager();
};

数据显示模块
是在控制台上进行显示,方法就是设置背景、字体颜色及窗口大小。其中语法高亮是通过切割字符串,将目标进行分段输出,以此达到高亮的功能。汉字转拼音功能是网上搜索而来【汉字转拼音
日志显示模块
主要是一些运行信息的打印

项目链接

文档快速搜索

本文地址:https://blog.csdn.net/qq_42429405/article/details/107314424