Qt实现查询是否有重复文件

每个文件都会有对应的MD5值,很多地方都是用这个来判断文件是否重复,来降低服务器的资源消耗。如某盘

我们可以借助MD5的值来判断文件是否重复。

1. 获取文件夹下的所有文件路径

QStringList Widget::getFiles(const QString &path)
{
    QStringList ret;
    QDir dir(path);
    //QDir::Dirs碰到隐藏目录会报错,所以使用Dir::AllDirs
    QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files|QDir::NoDotAndDotDot|QDir::Dirs);
    for(int i = 0; i <fileInfoList.count(); ++i){
        if(fileInfoList[i].isDir()){
            QStringList files = getFiles(fileInfoList[i].absoluteFilePath());
            ret.append(files);
        }
        else{
            ret.append(fileInfoList[i].absoluteFilePath());
        }
    }
    return ret;
}

2. 获取所有文件的MD5值

QByteArray Widget::getFileMd5(const QString &fileName)
{
    QCryptographicHash hash(QCryptographicHash::Md5);
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly)){
        QMessageBox::information(this,"infomation","打开文件失败");
        return QByteArray();
    }
    while (!file.atEnd()) {
        QByteArray text = file.read(1024*10);
        hash.addData(text);
        qApp->processEvents();
    }

    QByteArray fileMd5 = hash.result();

    return fileMd5;
}

3. 借助Hash表来判断MD5是否有重复

void Widget::on_pushButton_4_clicked()
{
    QString path = QFileDialog::getExistingDirectory(this);
    QStringList fileList =  getFiles(path);
    for(int i= 0; i < fileList.count(); i++){
        QString fileName = fileList.at(i);
        QByteArray md5 = getFileMd5(fileName);
        qDebug() << "fileName: "<<fileName <<" Md5:" << md5.toHex();
        fileMd5[md5].append(fileName);
    }

    for(QHash<QByteArray, QStringList>::iterator it = fileMd5.begin();it!=fileMd5.end();++it){
        QString info = QString("Md5:%1\tcount:%2").arg(QString(it.key().toHex())).arg(it.value().count());
        ui->textEdit_show->append(info);
        if(it.value().count() >1){
            QMessageBox::information(this,"有重复文件",it.value().first());
        }
    }
    fileMd5.clear();
}

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值