如果对C盘中一些需要管理员权限的文件路径操作的话,需要在.pro文件中添加获取管理员权限的代码,可自行搜索Qt添加管理员权限
实现原理:搜索文件因为很耗时,所以开了一个线程 ,线程中 实现搜索文件的操作,每找到一个目标文件触发信号,主线程接收信号对目标文件进行处理,指定路径搜索完毕之后触发线程搜索完毕信号,主线程接收该信号,再进行相应的操作。
线程类头文件filesearchthread.h
#ifndef FILESEARCHTHREAD_H
#define FILESEARCHTHREAD_H
#include <QThread>
class FileSearchThread : public QThread {
Q_OBJECT
public:
explicit FileSearchThread(const QString &targetFileName, const QString &searchPath, QObject *parent = nullptr)
: QThread(parent), targetFileName(targetFileName), searchPath(searchPath) {}
signals:
void fileFound(const QString &filePath);
signals:
void searchFinished();
protected:
void run() override {
searchFiles(searchPath);
emit searchFinished();
}
private:
void searchFiles(const QString &dirPath) ;
bool isShortcut(const QString &filePath);
QString targetFileName;
QString searchPath;
};
#endif // FILESEARCHTHREAD_H
线程类源文件filesearchthread.cpp
#include "filesearchthread.h"
#include <QFile>
#include <QDir>
void FileSearchThread::searchFiles(const QString &dirPath)
{
QDir dir(dirPath);
dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfoList fileList = dir.entryInfoList();
for (const QFileInfo &fileInfo : fileList) {
if (fileInfo.isDir()) {
// Recursive search in subdirectories
searchFiles(fileInfo.filePath());
} else if (fileInfo.isFile() && fileInfo.fileName() == targetFileName) {
// 过滤掉快捷方式等非目标文件
if (!isShortcut(fileInfo.filePath())) {
emit fileFound(fileInfo.filePath());
}
}
}
}
//检查是否是快捷方式
bool FileSearchThread::isShortcut(const QString &filePath) {
QFileInfo fileInfo(filePath);
return fileInfo.isSymLink();
}
主线程窗口类
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "filesearchthread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_pushButton_clicked();
void onSearchFinished();
private:
Ui::Dialog *ui;
public:
void onFileFound(const QString &filePath);
};
#endif // DIALOG_H
主线程源文件
void Dialog::on_pushButton_clicked()
{
QString targetFileName = ui->lineEdit->text();;
qDebug()<<targetFileName;
QFileInfoList drives = QDir::drives();
QString targetFolder;
// 遍历并输出每个驱动器的路径
foreach(const QFileInfo &drive, drives) {
qDebug() << "Drive: " << drive.absolutePath();
QString searchPath = drive.absolutePath();
// 创建 FileSearchThread 实例
FileSearchThread *searchThread = new FileSearchThread(targetFileName, searchPath, this);
// 连接信号和槽,处理找到文件的操作
connect(searchThread, &FileSearchThread::fileFound, this, &Dialog::onFileFound);
// 文件搜索完成信号连接搜索完成槽函数
connect(searchThread, &FileSearchThread::searchFinished, this, &Dialog::onSearchFinished);
//Num++;
// 启动搜索线程
searchThread->start();
}
}
//找到目标文件的槽函数
void Dialog::onFileFound(const QString &filePath) {
qDebug() << " File: " + filePath;
//在下面添加对该文件的复制,删除操作
}
//搜索完毕槽函数
void Dialog::onSearchFinished() {
qDebug() << "文件搜索完成";
// 执行搜索完成后的操作
}
工程源码链接,链接:https://pan.baidu.com/s/18Cc0XwgvlhrncPXM-deJmA
提取码:43ad
可以直接编译运行。