每个文件都会有对应的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();
}
效果图