Qt 实现指定路径搜索指定文件(包括需要管理员权限的路径)

        如果对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 
可以直接编译运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值