Qt的重复文件检测代码学习记录

代码编写思路:
在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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值