@TOC
1:本软件只适用于Windows系统,主要偏重整体框架和UI交互等。 2:主要功能包括文件名快速搜索,删除的文件恢复,usnjournal监控,多窗口同时显示等功能。
1:程序只获取NTFS系统下(包括GPT下的隐藏盘(隐藏盘只获取GPT分区下的)和U盘符)的文件名数据(非NFTS系统暂不处理)。 2:程序采集NTFS系统是动态运行,ntfs系统U盘的插入和拔出,程序自动获取数据和移除数据,格式化自动更新数据,更改盘符自动更新盘符名。 3:程序中对盘符的信息采用定时获取和比对,目的是节流。 4:程序打开盘符或打开物理硬盘只采用只读的形式打开,不做更改。 5:程序从NTFS系统中只获取一些文件的基本信息。 6:程序中对文件名排序的算法使用三路快排,其他用到的是快排。 7:程序中的文件图标从Windows注册表中解析后,存储到hash表中,实现快速获取。 8:程序中的文件数据从NTFS系统下的MFT表解析后,存储到hash表中(保存到内存中)实现快速搜索。 9:程序获取usnjournal然后写入到本地文件,本地文件发生改变,usnjournal还会获取,,,这样会造成一个死循环浪费cpu性能、占用不必要的内存。解决方法:程序内部获取要写入的日志文件夹(MFT号),从而过滤掉文件夹下的所有文件的变化。 9:系统采用纯QtWidget(非qml)编写,同时集成了数据库、多线程、配置文件、UI布局等众多知识点。
1:文件:新建窗口,导出,关闭窗口,退出程序。
2:日志:USN日志,运行日志。
3:视图:排序。
4:搜索:区分大小写,前置匹配,高级搜索,使用正则表达式,扩展名。
5:选项:设置,关于。
6:设置:开机自启动,显示托盘图标,实时搜索,隐藏搜索按钮,正常文件启用(恢复/复制数据),数据保存到数据库,窗口置顶,usnjournal不监控(不更新数据),隐藏某列。
实现:
//创建界面
void MainWindow::createUi()
{
SlotNewWindow(initWindowRect());
}
//初始化窗口大小和位置
QRect MainWindow::initWindowRect()
{
QDesktopWidget *screenResolution = QApplication::desktop();
int h = 600;//默认窗口的高度
int w = 1000;//默认窗口的宽度
//生成随机位置
quint32 w_rand =QRandomGenerator::global()->generate()%10;
quint32 h_rand =QRandomGenerator::global()->generate()%10;
return QRect((screenResolution->width()-w)/(w_rand == 0 ? 1 : w_rand),(screenResolution->height()- h)/(h_rand == 0 ? 1 : h_rand),w, h);
}
//新建窗口
void MainWindow::SlotNewWindow(QRect rect)
{
WindowClass *window = new WindowClass(rect);
window->show();
connect(m_dataManage,&DataManage::SignalDataChange,window->getModel(),&MyTableModel::SlotDataChange,Qt::QueuedConnection);//数据管理发送到model
MemoryPool::getInstance()->getWindows()->append(window);
}对当前显示的数据导出。保存形式有(.txt 、.csv 、.xlsx),xlsx用到的是外部库链接
对当前窗口关闭(如果设置中【显示托盘图标启用】,对当前窗口会隐藏。),如果是最后一个窗口,直接突出程序。
直接关闭程序。
实现详解 1:usn日志实现监控:监控当前Windows系统下的所有ntfs系统的数据的变更,每条usnjournal会追加到到界面显示。后台会对采集的数据保存到数据库中。实现用防抖。
void RealLogModel::init()
{
//定时器的创建和调用必须在同一个线程
timer = new QTimer();
//设置时间后,只触发一次,单次触发
if(!timer->isSingleShot()) {
timer->setSingleShot(true);
}
connect(timer,&QTimer::timeout,this,[&]()mutable {
//写入数据到数据库
writeDatas();
beData();
});
}
//接收数据
void RealLogModel::SlotAddData(S_USN_LOG item)
{
m_tempDatas.append(item);
//同时接收大量数据超过设定值,更新界面
if(m_tempDatas.count() >= ENDCOUNT){
//写入数据到数据库
writeDatas();
beData();
return;
}
timer->setInterval(100);
timer->start();
}

1:运行日志窗口采用Windows控制台窗口:输出当前打印的日志(打开和关闭都用下图中的按钮形式。采用重定向形式,打开后重定向控制台,日志打印到控制台,同时对日志分类保存到日志文件中。点击关闭按钮后重定向程序目录下 "___redirectionFile.txt" 文件下实现控制台的关闭。)
对搜索的文件名进行大小写区分,默认不区分。
对搜索的文件名前置完全匹配搜索,默认是包含内容搜索。
使用正则语法进行搜索,如果正则语法无效,则提示。正则语法1 正则语法2
使用文件后缀进行搜索,后缀包含文件图标显示。
实现更精准的搜索方式,同时包含以上搜素方式,包含对某个盘符的数据全部搜索、文件类型的搜索、扩展名的搜索、MFT号的搜索(一个盘只有一个mft号,一个mft号可能包含几个文件名(共享一块内存数据),mft一般是文件或目录)、PMFT号的搜索(和mft号一样,pmft号一般是目录)、文件属性的搜索(只读,隐藏等等)、文件名的搜索、文件大小的搜索、文件的创建时间和修改时间和访问时间的搜索。同时支持一键恢复到默认值。
1:有两种启动方式,一种采用注册表方式,这种方式有个弊端,会被忽略掉,开机自启动会失败。 这里实现用的Windows任务计划的方式。每次开机登录的时候启动程序。下面使用Windows命令编程实现:
if(checked){
//采用创建任务计划来完成开机登录自启
AutoRunprocess->start(QString("schtasks.exe"),QStringList()<<"/create"<<"/tn"<<application_name<<"/rl"<<"highest"<<"/tr"<<application_path<<"/sc"<<"onlogon"<<"/f");
} else {
//取消开机登录自启
AutoRunprocess->start(QString("schtasks.exe"),QStringList()<<"/delete"<<"/tn"<<application_name<<"/f");
}启用后会在Windows电脑右下角生成一个小图标,当软件关闭窗口最后一个时,这个时候软件会隐藏,不退出。不启用的话,默认直接退出程序。
启用后当主界面文件名编辑框发生改变,就会实时搜索数据。默认是不开启的。
启用后对主界面的搜索按钮进行隐藏。默认显示。

启用后程序退出后会将当前的数据保存到数据库(程序目录下database文件夹中),留作备份。(注意:就算保存到数据库,程序下次启用也不会从数据库中加载)
启用后主窗口永远在最前面。
启用后所有盘符不监控usnjournal,所有文件的变化也不会更新。
只有文件名没勾选,主界面只有文件名列显示。(作用:可以方便的把不感兴趣的信息隐藏)
程序采用安装和覆盖安装的形式,同时创建桌面图标和开始菜单链接。 参考链接
提示:这里对文章进行总结:
首次更新:2022.6.20















