QT-监测文件内容重复工具)

QT-监测文件内容重复工具

  • 一、演示效果
  • 二、核心代码
  • 三、下载链接


一、演示效果

在这里插入图片描述

二、核心代码

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include <QFile>
#include <QCryptographicHash>
#include <QApplication>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <QCloseEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);thread.start();md5.moveToThread(&thread);//跨線程傳遞自定義類型/模板時,要使用下列方法先注冊,否則會報錯qRegisterMetaType<QHash<QByteArray,QStringList>>("QHash<QByteArray,QStringList>");/** 按下按鈕->發送&Widget::checkDumplate( 信號 )* &Widget::checkDumplate( 信號 )與&FileMd5::checkDumplate( 槽 )相連接* &FileMd5::checkDumplate( 槽 )發送 &FileMd5::gotDumplate( 信號 )* &FileMd5::gotDumplate( 信號 )與&Widget::onGotDumplate( 槽 )相連接* 最後:&Widget::onGotDumplate( 槽 )將重複文件的hash添加到listWidget中*/connect(this,&Widget::checkDumplate,&md5,&FileMd5::checkDumplate);connect(&md5,&FileMd5::gotDumplate,this,&Widget::onGotDumplate);connect(&md5,&FileMd5::process,this,&Widget::onProcess);}Widget::~Widget()
{//關閉線程thread.exit();thread.wait();delete ui;
}void Widget::closeEvent(QCloseEvent *event)
{if(!isDone){QMessageBox::warning(this,"警告","文件加載中,請物關閉窗口");//忽略這個事件,當前窗口不會關閉event->ignore();}else{//接收這個事件,當前窗口會關閉event->accept();}}void Widget::on_pushButton_clicked()
{ui->progressBar->setValue(0);ui->listWidget->clear();//判斷是否有文件正在加載if(!isDone){QMessageBox::warning(this,"警告","年輕人別太心急,我跑不動了");return;}isDone = false;//選擇目錄QString path = QFileDialog::getExistingDirectory(this,"Choose Dir",".");ui->lineEdit->setText(path);emit checkDumplate(path);
}void Widget::onGotDumplate(const QHash<QByteArray, QStringList> &dumplates)
{this->dumplates = dumplates;for(QHash<QByteArray,QStringList>::const_iterator it = dumplates.begin(); it != dumplates.end(); it++){if(it.value().count()>1){ui->listWidget->addItem(it.key());}}if(ui->listWidget->count()==0){ui->listWidget->addItem("沒有重複的文件");}}void Widget::onProcess(int current, int total)
{ui->progressBar->setValue(current);ui->progressBar->setMaximum(total);if(current == total){isDone = true;}
}void Widget::on_listWidget_currentTextChanged(const QString &currentText)
{ui->listWidget_2->clear();QStringList fileList = this->dumplates[currentText.toLocal8Bit()];ui->listWidget_2->addItems(fileList);
}
#include "FileMd5.h"
#include <QFileInfo>
#include <QDir>
#include <QCryptographicHash>
#include <QApplication>
#include <QDebug>FileMd5::FileMd5(QObject *parent) : QObject(parent)
{}void FileMd5::checkDumplate(const QString &path)
{//寫代碼檢測文件重複QHash<QByteArray,QStringList> ret;QStringList files = getFiles(path);for(int i = 0; i < files.count(); i++){QString fileName = files.at(i);QByteArray md5 = getFileMd5(fileName);ret[md5].append(fileName);emit process(i+1,files.count());}emit gotDumplate(ret);
}QStringList FileMd5::getFiles(const QString &path)
{QStringList ret;QDir dir(path);//.表示當前目錄,..表示上一級目錄//entryInfoList:返回目錄中所有文件和目錄的QFileInfo對象列表QFileInfoList infoList = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);for(int i=0; i < infoList.count(); i++){QFileInfo info = infoList.at(i);if(info.isDir()){QString subDir = info.absoluteFilePath();QStringList files = getFiles(subDir);ret.append(files);}else{QString fileName = info.absoluteFilePath();ret.append(fileName);}}return ret;
}QByteArray FileMd5::getFileMd5(const QString &fileName)
{QFile file(fileName);if(!file.open(QIODevice::ReadOnly)){return QByteArray();}QCryptographicHash hash(QCryptographicHash::Md5);while(!file.atEnd()){QByteArray content = file.read(100 * 1024 * 1024); //一次讀取100MB的內容hash.addData(content); //將content的數據添加到密碼散列qApp->processEvents(); //防止整個程序卡住(作用不大)}QByteArray md5 = hash.result().toHex(); //獲取最終的哈希值file.close();return md5;
}

三、下载链接

https://download.csdn.net/download/u013083044/89654075

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/405880.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用Python构建高校爬虫与k-means算法实现专业评分可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

多线程、多进程,还是异步?-- Python 并发 API 如何选择

如何选择正确的 Python 并发 API模块 &#xff1f; Python 标准库提供了三种并发 API &#xff0c; 如何知道你的项目应该使用哪个 API&#xff1f; 在本教程将带逐步了解各API的特性、区别以及各自应用场景&#xff0c;指导你选择最合适的并发 API。 多线程、多进程&#xff0…

F1 F4 Fn lock 指示灯不亮 联想笔记本 thinkpad

问题描述&#xff1a;F1 F4 Fn lock 指示灯开机的时候亮&#xff0c;但是使用的时候虽然能够发挥正常功能&#xff0c;但是指示灯一直熄灭&#xff0c;指示灯不亮。 电脑型号&#xff1a;联想笔记本 thinkpad E14 Gen 2 。本方案应该适用于所有联想电脑。 解决方法&#xff1a;…

鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程

下图是一个可执行文件编译&#xff0c;链接的过程. 本篇将通过一个完整的小工程来阐述ELF编译&#xff0c;链接过程&#xff0c;并分析.o和bin文件中各区&#xff0c;符号表之间的关系.从一个崭新的视角去看中间过程. 准备工作 先得有个小工程&#xff0c;麻雀虽小&#xff0…

基于数据复杂度的数据库选型

数据模型的选择对于 IT 系统的开发至关重要&#xff0c;它不仅决定了数据存储和处理的方式&#xff0c;影响系统的性能、扩展性以及维护性等。本质上来说&#xff0c;不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…

【Qt】常用控件QCalendarWidget的使用

常用控件QCalendarWidget的使用 QCalendarWidget表示一个日历 核心属性 属性说明 selectDate 当前选中的⽇期 minimumDate 最⼩⽇期 maximumDate 最⼤⽇期 firstDayOfWeek 每周的第⼀天(也就是⽇历的第⼀列) 是周⼏. gridVisible 是否显⽰表格的边框 selectionMode…

python3爬虫(未完结)

一个简单的例子&#xff1a;爬取自己的csdn博客&#xff0c;统计每篇博客的访问量&#xff0c;制作一个柱状图&#xff0c;以访问量从大到小的方式显示。 1. 首先从“个人主页”爬取所有所有文章的链接 1.1 打开个人主页&#xff0c;右键->检查&#xff1a;可以看到每篇文章…

类和对象(下)(2)

类和对象&#xff08;下&#xff09;(2) static成员 • ⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进⾏初始化。 • 静态成员变量为当前类的所有对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#…

HiveSQL实战——大厂面试真题

一、字节跳动 最高峰同时直播人数 https://blog.csdn.net/SHWAITME/article/details/135918264 0 问题描述 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台最高峰同时直播人数。 ------------------------------------------------------ | us…

CTFHUB | web进阶 | JSON Web Token | 无签名

一些JWT库也支持none算法&#xff0c;即不使用签名算法。当alg字段为空时&#xff0c;后端将不执行签名验证 开启题目 账号密码随便输&#xff0c;登录之后显示只有 admin 可以获得 flag 在此页面抓包发到 repeater&#xff0c;这里我们需要用到一个 Burp 插件&#xff0c;按图…

Linux信号机制探析--信号的产生

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;信号什么是信号&#xff1f;为什么要有信号&#xff1f;查看Linux系统中信号 &#x1f388;信号产生&#x1f4d5;kill…

【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)

目录 1. RTMP_ConnectStream函数1.1 读取packet&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…

JAVA面试汇总

JAVA面试 JAVA面试精华 面试精华 互联网面试真题

keepalived详解

概念 keepalived 是一款基于 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;协议来实现高可用&#xff08;High Availability, HA&#xff09;的轻量级软件。它主要用于防止单点故障&#xff0c;特别是在 Linux 环境下&#xff…

使用maven快速生成打包文件

最近在部署基于SpringBoot开发的项目时&#xff0c;由于微服务较多&#xff0c;本地工程编译后只得出一个JAR包&#xff0c;部署起来实在不方便&#xff0c;因此总想着怎么偷偷懒&#xff0c;执行一次命令编译出整个部署的文件。先说结果&#xff0c;最后期望打包的目录如下&am…

C++ | 继承

前言 本篇博客讲解c中的继承 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&…

Kubernetes 如何给pod的 /etc/hosts文件里面添加条目

创建pod的时候&#xff0c;pod会在其/etc/hosts里面添加一个条目。 [rootmaster ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dns-test 1/1 R…

LLM概念梳理(二):检索增强RAG

非常感谢RAG&#xff08;检索增强生成&#xff09;技术详解&#xff1a;基于垂直领域专有数据的 Chatbots 是如何实现的&#xff0c;这篇文章对 RAG 技术进行了详细的描述。我根据自己的理解&#xff0c;并且按照代码思路重新进行整理。 RAG 技术看似神奇&#xff0c;其本质是…

图片怎么压缩得小一点?这八种免费图片压缩方法赶紧试试

在数字化时代&#xff0c;无论是工作还是日常生活中&#xff0c;图片的使用已变得不可或缺。然而&#xff0c;随着高分辨率图片的广泛应用&#xff0c;文件体积也随之增加&#xff0c;这不仅占用了大量存储空间&#xff0c;还可能导致传输和加载速度变慢。因此&#xff0c;如何…

干货:2024必备的四大PDF编辑器推荐!

面对PDF文件的编辑需求&#xff0c;你是否感到无从下手&#xff1f;那么&#xff0c;今天就为大家推荐几款实用的PDF编辑工具&#xff0c;让你轻松应对各种PDF编辑难题。 福昕PDF编辑器 链接&#xff1a;editor.foxitsoftware.cn 福昕PDF编辑器多功能专业级是我PDF编辑器。它…