代码编写思路:
在ui上添加一个button按钮,打开一个文件夹,利用hash方法,获取 md5的值,如果md5的值有相同的,则说明文件夹里面有重复的文件;
方法说明: 利用的是#include类实现md5计算;
利用QDir,QFileInfo等类实现文件的查询;
利用#include实现计算后的结果存储,并打印相关重复文件信息;
具体代码讲解:
1)//遍历某一个目录的文件及文件夹
QStringList Widget::searchFiles(const QString &path)
{
QStringList ret;
QDir dir(path); //构造一个目录
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()) //如果是目录,就递归调用getFIles,再次检测;
{
QString subDir = info.absoluteFilePath();
QStringList files = searchFiles(subDir);
ret.append(files);
}
else //是普通文件
{
QString fileName = info.absoluteFilePath();
ret.append(fileName);
}
}
return ret; //返回所有的文件及目录列表;
}
2)传一个文件,计算该文件的md5;
QByteArray Widget::getFileMd5(const QString &files)
{
QFile file(files);
if(file.open(QIODevice::ReadOnly))
{
QCryptographicHash hash(QCryptographicHash::Md5);
while(!file.atEnd())
{
QByteArray content = file.read(100*1024*1024);
hash.addData(content);
qApp->processEvents(); //解决大文件计算卡顿问题
}
QByteArray md5 = hash.result();
file.close();
return md5;
}
return QByteArray();
}
3)添加一个button按钮,并转到槽,相关的代码如下:
void Widget::on_getFiles_clicked()
{
QStringList files = searchFiles("D:/work/MyQt59/rfid/test"); //获得某一个目录的所有文件列表
for(int i = 0; i<files.count(); i++)
{
QString fileName = files.at(i);
QByteArray md5 = this->getFileMd5(fileName); //调用getFileMd5函数,计算每个文件的md5值
qDebug()<<" fileName:"<< fileName << "md5: "<< md5.toHex();
fileMd5[md5].append(fileName);
}
//遍历所有hash的值,相关定义在后面
for(QHash<QByteArray,QStringList>::iterator it = fileMd5.begin(); it != fileMd5.end(); it++)
{
qDebug()<<"md5:"<<it.key().toHex() <<" count: "<<it.value().count();
}
}
4)对应的ui头文件定义代码如下:
#include<QPoint>
#include<QHash>
#include<QCryptographicHash>
#include<QCoreApplication>
#include<QDir>
#include<QFileInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QStringList searchFiles(const QString& path);
QByteArray getFileMd5(const QString& files);
private slots:
void on_getFiles_clicked();
private:
Ui::Widget *ui;
//第一个参数存md5,第二个参数是文件列表
QHash<QByteArray,QStringList> fileMd5;
};
#endif // WIDGET_H```
5)运行解决如下:
md5: "a0b087681a2d18249ea255251ad5a881" count: 2 //说明这个文件是有重复的
md5: "b84d4f753e37fe169e9396826fddad65" count: 1
md5: "3fb64cba9c9caf5b7fcf18dd4594ef20" count: 1
md5: "d8729f0ed3f0bd9f4da8dd0e7f30f04b" count: 1
md5: "df0d4aef8aa8822bcbb0256ab6df35b4" count: 1
md5: "615334850701edaf974afee9c63c8398" count: 1
md5: "c862930086c00b64adde389c68b05bd3" count: 1
md5: "79f7dbf878cfcf690eba361ee007da26" count: 1
md5: "d00bb3829ea3dd43d875fb9e21e5a0aa" count: 1