Qt实现遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(三)

下面是自己的实际工作中写的代码,请大家斧正

#ifndef INQUIRYDIALOG_H
#define INQUIRYDIALOG_H

#include <QDialog>
#include <QFileDialog>
#include <QDir>
#include <QDesktopServices>
#include <QUrl>
#include <QProgressDialog>

namespace Ui {
class InquiryDialog;
}

class InquiryDialog : public QDialog
{
    Q_OBJECT
    
public:
    explicit InquiryDialog(QWidget *parent = 0);
    ~InquiryDialog(); 
    void ExecuteSearch(const QDir& dir,const QString& form,const QString& content);
    QStringList FindFiles(const QDir& dir,const QString& form,const QString& content);
    QStringList findfile(const QDir& dir,const QString& content);
    void ShowFiles(const QDir& dir,const QString& form,const QStringList& files);


private slots:
    void openPathBtn_clicked();
    void inquiryBtn_clicked();
    void closeInquiryBtn_clicked();
    void openFileOfItem(int row, int column);
    
private:
    Ui::InquiryDialog *ui;
    QDir currentDir;
    QStringList files;
    int m_nCOunt;

    void createdTableWidget();
};

#endif // INQUIRYDIALOG_H


#include "inquirydialog.h"
#include "ui_inquirydialog.h"
#include <QDebug>
#include <QTextDocument>

InquiryDialog::InquiryDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::InquiryDialog)
{
    ui->setupUi(this);
    createdTableWidget();
    connect(ui->openPathBtn,SIGNAL(clicked()),this,SLOT(openPathBtn_clicked()));
    connect(ui->inquiryBtn,SIGNAL(clicked()),this,SLOT(inquiryBtn_clicked()));
    connect(ui->closeInquiryBtn,SIGNAL(clicked()),this,SLOT(closeInquiryBtn_clicked()));

    QString currentPath;
    QDir dir;
    currentPath = dir.currentPath();
    qDebug()<<"path"<<currentPath;
    ui->pathBox->addItem(currentPath);
}

InquiryDialog::~InquiryDialog()
{
    delete ui;
}

void InquiryDialog::createdTableWidget()
{
    ui->m_TxtlineEdit->setPlaceholderText("文件名前缀或后缀");
    ui->inquiryWidget->setFocus();
    ui->foundLabel->setText(tr("找到0个文件"));
    ui->inquiryWidget->horizontalHeader()->setResizeMode(0, QHeaderView::ResizeToContents);
    ui->inquiryWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);
    ui->inquiryWidget->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents);
    connect(ui->inquiryWidget, SIGNAL(cellActivated(int,int)),this, SLOT(openFileOfItem(int,int)));
}

void InquiryDialog::openFileOfItem(int row, int)
{
    QTableWidgetItem *item = ui->inquiryWidget->item(row, 0);
    QDesktopServices::openUrl(QUrl::fromLocalFile(currentDir.absoluteFilePath(item->text())));
}

void InquiryDialog::openPathBtn_clicked()
{
    QString dir = QFileDialog::getExistingDirectory(this, tr("打开文件"), QDir::currentPath());
    if (!dir.isEmpty())
    {
        if (ui->pathBox->findText(dir) == -1)
            ui->pathBox->addItem(dir);
        ui->pathBox->setCurrentIndex(ui->pathBox->findText(dir));
    }
}

void InquiryDialog::inquiryBtn_clicked()
{
    ui->inquiryWidget->setRowCount(0);
    m_nCOunt = 0;
    ui->m_txtBox->isChecked();
    QString dir = ui->pathBox->currentText();
    QString content = ui->m_TxtlineEdit->text();
    QString form = ui->formBox->currentText();
    ExecuteSearch(QDir(dir),form,content);
}

void InquiryDialog::ExecuteSearch(const QDir& dir,const QString& form,const QString& content)
{

    if(ui->m_txtBox->isChecked())
    {
        QStringList folders = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
        for (int i = 0 ; i < folders.size(); i++)
        {
            qApp->processEvents();
            QString strDir = QString(tr("%1/%2")).arg(dir.absolutePath()).arg(folders[i]);
            ExecuteSearch(strDir,form,content);
        }
    }

    QStringList files = FindFiles(dir,form,content);
    ShowFiles(dir,form,files);
    m_nCOunt += files.size();
    ui->foundLabel->setText(tr("找到%1个文件").arg(m_nCOunt));
}

QStringList InquiryDialog::FindFiles(const QDir& dir,const QString& form,const QString& content)
{
    files = dir.entryList(QStringList(form),QDir::Files|QDir::NoSymLinks);
    QStringList filesList;
    if(content.isEmpty())
    {
        return files;
    }
    filesList = findfile(dir,content);
    return filesList;
}

QStringList InquiryDialog::findfile(const QDir& dir,const QString& content)
{
    QStringList findFiles;
    QString strSffix;
    QString strBaseName;
    QString str;
    for (int i = 0 ; i < files.size() ; i++)
    {
        qApp->processEvents();
        QFile file(dir.absoluteFilePath(files[i]));
        QFileInfo fileInfo(file);
        strSffix = fileInfo.suffix();
        strBaseName = fileInfo.baseName();
       // qDebug()<<"strSffix"<<strSffix<<"**********";
        qDebug()<<"strBaseName"<<strBaseName<<"****";
        if((content == strSffix) || (content == fileInfo.baseName()))
        {
            if (file.open(QIODevice::ReadOnly))
            {
                QString line;
                QTextStream instream(&file);
                while(!instream.atEnd())
                {
                    line = instream.readLine();
                    findFiles<<files[i];
                    break;
                }
            }
        }
      //  else
        {
//            for(int k = 0;k < strBaseName.length();k++)
//            {
//                str.append(strBaseName.at(k));
//                if (content == strBaseName.at(k) || content == str)
//                {
//                    if (file.open(QIODevice::ReadOnly))
//                    {
//                        QString line;
//                        QTextStream instream(&file);
//                        while(!instream.atEnd())
//                        {
//                            line = instream.readLine();
//                            findFiles<<files[i];
//                            break;
//                        }
//                    }
//                    break;
//                }
//            }
        }
    }
    return findFiles;
}

void InquiryDialog::ShowFiles(const QDir& dir,const QString& form,const QStringList& files)
{
    for(int i = 0 ; i < files.size();i++)
    {
        QString permit;
        QFile file(dir.absoluteFilePath(files[i]));
        qint64 size = QFileInfo(file).size();
        QFileInfo fileInfo(file);
        QString time =  fileInfo.lastModified().toString("yyyy/MM/dd hh:mm:ss");
        if(fileInfo.isWritable())
        {
            permit = "可写";
        }
        else if(fileInfo.isReadable())
        {
            permit = "可读";
        }
        QTableWidgetItem* pTimeItem    = new QTableWidgetItem(time);
        QTableWidgetItem* pPermitItem  = new QTableWidgetItem(permit);
        QTableWidgetItem *fileNameItem = new QTableWidgetItem(files[i]);
        fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable);
        QTableWidgetItem *sizeItem = new QTableWidgetItem(tr("%1 KB")
                                             .arg(int((size + 1023) / 1024)));
     //   sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);//设置左对齐属性
        sizeItem->setFlags(sizeItem->flags() ^ Qt::ItemIsEditable);

        int row = ui->inquiryWidget->rowCount();
        ui->inquiryWidget->insertRow(row);
        ui->inquiryWidget->setItem(row, 0, fileNameItem);
        ui->inquiryWidget->setItem(row, 1, sizeItem);
        ui->inquiryWidget->setItem(row,2,pTimeItem);
        ui->inquiryWidget->setItem(row,3,pPermitItem);
    }
}


void InquiryDialog::closeInquiryBtn_clicked()
{
    close();
}


下面是运行图

Qt实现遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(三)