Windows 文件检索工具
Windows 文件检索工具
开发工具
开发工具:VS2017,sqlite3
项目功能
1.支持文档普通搜索
2.支持拼音全拼搜索
3.支持拼音首字母搜索
4.支持搜索关键字高亮
项目简介
利用 sqlite3 数据库动态保存Windows磁盘下的文件信息( Windows下获得文件信息的结构体_finddata_t),并利用 sqlite3的 selec t 方法来查找数据库中所保存的数据,以此达到快速查找文件的功能。项目中使用了 set 容器
(底层为红黑树,查找和插入的效率比较高)来记录本地数据与数据库的数据,将两者数据对比并更新数据库中的数据以此来完成文件的实时查找(使用了多线程编程以提高查找效率及扫描效率)。
项目模块
总体设计
数据处理模块
主要是对数据库进行管理(提供数据库的增删查改功能),并对数据库中的数据进行处理。将磁盘上的文件信息导入数据库,使用数据库的对外接口来查找我们所输入的文件名(通过数据库模糊查找命令,可以进行文件名的模糊匹配,本模块并不对数据库进行修改)。
以下是本模块的一些方法
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
上一篇: HDU 2899 Strange fuction(牛顿迭代)
下一篇: 解决粘包问题