1 Star 0 Fork 0

Notepad-- Community/filesearch

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
searchfiledata.cpp 5.70 KB
一键复制 编辑 原始数据 按行查看 历史
爬山虎 提交于 2023-12-16 15:15 +08:00 . 提交全部代码
#include "searchfiledata.h"
#include <QDir>
#include <QDateTime>
#include <QRegularExpression>
SearchFileData::SearchFileData(QObject *parent)
: QObject(parent), m_isCancel(false), m_isDone(false), m_fileNums(0)
{
}
SearchFileData::~SearchFileData()
{
}
//这个接口,得在外面主线程中访问。严格来说,主线程中调用了子线程中的函数。有一定的风险。
void SearchFileData::setCancel(bool value)
{
m_isCancel = value;
}
void SearchFileData::setIsDone(bool value)
{
m_isDone = value;
}
//这个接口,得在外面主线程中访问。严格来说,主线程中调用了子线程中的函数。有一定的风险。
bool SearchFileData::isDone()
{
return m_isDone;
}
int SearchFileData::getFileNums()
{
return m_fileNums;
}
//非递归版本。遍历目录,该函数是在子线程中执行,注意不能操作UI类
void SearchFileData::on_walkFile(QString searchPath, int maxResultNum, bool isNoSymlink, bool isFileNameRe, QString fileNameRe, bool isFileSuffixType, QStringList fileSuffixType, \
bool isFileSize, qint64 fileSizeLimit, bool isFileCreateTimeLater, QDateTime createTimeLater, bool isFileCreateTimeEarlier, QDateTime createTimeEarlier,\
bool isFileModifyLater, QDateTime modifyTimeLater, bool isFileModifyEarlier, QDateTime modifyTimeEarlier)
{
QList<QString> dirsList;
dirsList.append(searchPath);
int fileNums = 0;
//再获取文件夹到列表
QDir::Filters dirfilter;
dirfilter = QDir::Dirs | QDir::NoDotAndDotDot;
//过滤文件后缀isFileSuffixType
//过滤文件类型。true 合格,需要处理, false 不合格,跳过
auto fileTypeFilter = [=](QFileInfo& fileInfo)->bool {
QString suffix = fileInfo.suffix();
if (!suffix.isEmpty())
{
if (-1 == fileSuffixType.indexOf(suffix))
{
suffix = fileInfo.completeSuffix();
//统一转小写,不区分大小写
return (-1 != fileSuffixType.indexOf(suffix.toLower()));
}
else
{
return true;
}
}
//对于没有后缀的文件,一律跳过
return false;
};
QRegularExpression re;
if (isFileNameRe)
{
re.setPattern(fileNameRe);
}
//名称是否满足正则过滤。不满足则不替换
auto filterFileNameRe = [=](QFileInfo& fileInfo)
{
QRegularExpressionMatch m = re.match(fileInfo.fileName());
return m.hasMatch();
};
//名称是否满足正则过滤。不满足则不替换
auto filterFileTime = [=](QFileInfo& fileInfo, int type)
{
if (type == 0)
{
return fileInfo.birthTime() > createTimeLater;
}
else if (type == 1)
{
return fileInfo.birthTime() < createTimeEarlier;
}
else if (type == 2)
{
return fileInfo.lastModified() > modifyTimeLater;
}
else if (type == 3)
{
return fileInfo.lastModified() < modifyTimeEarlier;
}
return false;
};
int dirNums = 0;
bool firstChildDirs = true;
int totalStep = 0;
while (!dirsList.isEmpty())
{
QString path = dirsList.takeFirst();
QDir dir(path); //遍历各级子目录
QFileInfoList folder_list = dir.entryInfoList(dirfilter); //获取当前所有目录
for (int i = 0; i != folder_list.size(); ++i) //自动递归添加各目录到上一级目录
{
QString namepath = folder_list.at(i).absoluteFilePath(); //获取路径
//注意这里是添加在头部,外面也要保存同样的顺序
dirsList.push_front(namepath);
dirNums++;
if (0 == (dirNums % 1000))
{
emit outMsg(PROGRESS_INFO, tr("scan %1 dirs").arg(dirNums));
}
}
if (firstChildDirs)
{
totalStep = dirNums;
firstChildDirs = false;
emit outMsg(SET_PROGRESS_TOTAL_STEPS, "", dirNums);
}
if (dirsList.size() < totalStep)
{
totalStep = dirsList.size();
emit outMsg(PROGRESS_STEP, "");
}
QDir dir_file(path);
QDir::Filters flags = QDir::Files | QDir::NoDotAndDotDot;
if (isNoSymlink)
{
flags |= QDir::NoSymLinks;
}
dir_file.setFilter(flags);//获取当前所有文件
QFileInfoList list_file = dir_file.entryInfoList();
for (int i = 0; i < list_file.size(); ++i)
{ //将当前目录中所有文件添加到treewidget中
QFileInfo fileInfo = list_file.at(i);
//不支持所有文件,仅仅支持支持的类型
if (isFileSuffixType && !fileTypeFilter(fileInfo))
{
continue;
}
if (isFileNameRe && !filterFileNameRe(fileInfo))
{
continue;
}
if (isFileSize && (fileInfo.size() < fileSizeLimit))
{
continue;
}
if (isFileCreateTimeLater && !filterFileTime(fileInfo, 0))
{
continue;
}
if (isFileCreateTimeEarlier && !filterFileTime(fileInfo, 1))
{
continue;
}
if (isFileModifyLater && !filterFileTime(fileInfo, 2))
{
continue;
}
if (isFileModifyEarlier && !filterFileTime(fileInfo, 3))
{
continue;
}
//找到一个合适的目标
CmpWalkFileInfo* fileNode = new CmpWalkFileInfo();
fileNode->filePath = fileInfo.absoluteFilePath();
fileNode->fileSize = fileInfo.size();
fileNode->createTime = fileInfo.birthTime().toString("yy/MM/dd hh:mm:ss");
fileNode->modifyTime = fileInfo.lastModified().toString("yy/MM/dd hh:mm:ss");
emit s_foundFile(fileNode);
if (m_isCancel)
{
emit outMsg(PROGRESS_INFO, tr("compare canceled ..."));
break;
}
++fileNums;
if (0 == (fileNums % 100))
{
emit outMsg(PROGRESS_INFO, tr("search found %1 file .").arg(fileNums));
}
}
if (fileNums >= maxResultNum)
{
emit outMsg(PROGRESS_INFO, tr("Current number of results %1 has exceeded the maximum number of results %2 !").arg(fileNums).arg(maxResultNum));
break;
}
if (m_isCancel)
{
break;
}
}
m_isDone = true;
m_fileNums = fileNums;
//全部文件加载完毕。要等到这个槽函数执行后,主界面中才能算所有文件节点创建完毕。
CmpWalkFileInfo* finishFlag = new CmpWalkFileInfo();
finishFlag->filePath = "";
finishFlag->fileSize = -1;
emit s_foundFile(finishFlag);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/ndd-community/filesearch.git
git@gitee.com:ndd-community/filesearch.git
ndd-community
filesearch
filesearch
master

搜索帮助