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();
}
下面是运行图