项目二——快速搜索文档神器

编程入门 行业动态 更新时间:2024-10-19 20:37:32

项目二——快速搜索文档<a href=https://www.elefans.com/category/jswz/34/1765229.html style=神器"/>

项目二——快速搜索文档神器

一.项目原因

Linux下有功能强大的find命令,而windows下文件夹框下的默认搜索是搜索时再进行暴力遍历查找,非常的慢。

所以做一个类似everything的搜索软件来进行搜索目的。

二.项目需求

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

三.开发环境

1.编译器 : VS2013 / 控制应用平台

2.编程语言 : C++ / C++11

2.数据库 : sqlite3

4.项目涉及的知识点

  • 数据库操作:(sqlite安装,创建数据库,创建表,插入数据,删除数据,创建索引,查询数据 (条件查询、 模糊查询))
  • 静态库和动态库:静态库和动态的制作,动态库和动态的使用
  • 设计模式(单例模式)
  • 多线程同步机制(互斥量)
  • 日志
  • 汉字与拼音的转换

三.项目实现

公共模块

#pragma once#include<iostream>
using namespace std;#include<string>
#include<vector>
#include<set>#include<stdarg.h>#include<windows.h>#include<io.h>#include<thread>
#include<chrono>#include<algorithm>#include<mutex>  
#include<condition_variable>#define MAX_SQL_SIZE 256
#define MAX_BUF_SIZE 128

系统工具模块

#pragma once#include"Common.h"#ifndef __TRACE__
//#define __TRACE__
#endif#ifndef __DEBUG__
//#define __DEBUG__
#endif///
static std::string GetFileName(const std::string& path)
{char ch = '/';  //Linux   #ifdef _WIN32      ch = '\\';
#endif size_t pos = path.rfind(ch);if (pos == std::string::npos)return path;elsereturn path.substr(pos + 1);
}//用于调试追溯的trace log
inline static void __TraceDebug(const char* filename, int line, const char* function, const char* format, ...)
{
#ifdef __TRACE__//输出调用函数的信息fprintf(stdout, "[TRACE][%s:%d:%s]:", GetFileName(filename).c_str(), line, function);//可变参数//输出用户打的trace信息va_list args;va_start(args, format);vfprintf(stdout, format, args);va_end(args);fprintf(stdout, "\n");
#endif
}inline static void __ErrorDebug(const char* filename, int line, const char* function, const char* format, ...)
{
#ifdef __DEBUG__//输出调用函数的信息fprintf(stdout, "[ERROR][%s:%d:%s]:", GetFileName(filename).c_str(), line, function);//输出用户打的trace信息va_list args;va_start(args, format);vfprintf(stdout, format, args);va_end(args);fprintf(stdout, " errmsg:%s, errno:%d\n", strerror(errno), errno);
#endif
}#define TRACE_LOG(...) \__TraceDebug(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);#define ERROR_LOG(...) \__ErrorDebug(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);
//界面模块#define WIDTH 120
#define HEIGHT 30void SetCurPos(int x, int y); //x 带表界面的行   y 代表界面的列
void HideCursor();void DrawCol(int x, int y);
void DrawRow(int x, int y);void DrawFrame(char *title);
void DrawMenu();void SystemEnd();/
//获取文件个数
size_t GetFileCount(const string &path);//目录监控函数
bool DirectoryWatch(const string &path);//系统功能函数模块
void DirectoryList(const string &path, vector<string> &subfile, vector<string> &subdir);// 汉字转拼音全拼
/* CSDN: */
string ChineseConvertPinYinAllSpell(const string& dest_chinese);
// 汉字转拼音首字母
string ChineseConvertPinYinInitials(const string& name);// 颜色高亮显示一段字符串
void ColourPrintf(const string  &str);
#define _CRT_SECURE_NO_WARNINGS 1
#include"Sysutil.h"//设置光标位置
void SetCurPos(int x, int y)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { y, x };SetConsoleCursorPosition(handle, pos);
}
//隐藏光标
void HideCursor()
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO cursor_info = { 100, 0 };SetConsoleCursorInfo(handle, &cursor_info);
}
//画列  ||
void DrawCol(int x, int y)
{for (int i = 0; i<HEIGHT; ++i){SetCurPos(x + i, y);printf("||");}
}//画行 =
void DrawRow(int x, int y)
{for (int i = 0; i<WIDTH - 4; ++i){SetCurPos(x, y + i);printf("=");}
}void SystemEnd()
{SetCurPos(HEIGHT - 1, (WIDTH - 4 - strlen("请按任意键继续 . . .")) / 2);
}//画系统框架界面
void DrawFrame(char *title)
{//设置标题char buf[MAX_BUF_SIZE] = { 0 };sprintf(buf, "title %s", title);system(buf);//设置界面的宽度和高度memset(buf, 0, MAX_BUF_SIZE);sprintf(buf, "mode con cols=%d lines=%d", WIDTH, HEIGHT);system(buf);//设置颜色//设置系统界面DrawCol(0, 0);  //左边列DrawCol(0, WIDTH - 2); //右边列DrawRow(0, 2);DrawRow(2, 2);DrawRow(4, 2);DrawRow(HEIGHT - 6, 2);DrawRow(HEIGHT - 4, 2);DrawRow(HEIGHT - 2, 2);
}extern char *title;
void DrawMenu()
{//设置标题SetCurPos(1, (WIDTH - 4 - strlen(title)) / 2);printf("%s", title);//设置名称 路径SetCurPos(3, 2);printf("%-30s%-85s", "名称", "路径");//设置 exit 退出系统SetCurPos(HEIGHT - 3, (WIDTH - 4 - strlen("exit 退出系统 .")) / 2);printf("%s", "exit 退出系统 .");//设置 输入:>SetCurPos(HEIGHT - 5, 2);printf("%s", "请输入:>");
}//extern size_t g_FileCount;
extern size_t g_ScanCount;size_t GetFileCount(const string &path)
{string _path = path + "\\" + "*.*";struct _finddata_t fileAttri;long handle = _findfirst(_path.c_str(), &fileAttri);if (handle == -1)return 0;do{if (fileAttri.name[0] == '.')continue;g_ScanCount++;if (fileAttri.attrib & _A_SUBDIR)GetFileCount(path + "\\" + fileAttri.name);} while (_findnext(handle, &fileAttri) == 0);return g_ScanCount;
}bool DirectoryWatch(const string &path)
{size_t file_count = GetFileCount(path);return file_count != g_FileCount;
}// 汉字转拼音全拼
/* CSDN: */
string ChineseConvertPinYinAllSpell(const string& dest_chinese)
{static const int spell_value[] ={-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032, -20026,-20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728,-19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275

更多推荐

项目二——快速搜索文档神器

本文发布于:2024-02-25 19:56:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1700123.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:神器   快速搜索   文档   项目

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!