Qt实现文件分类小工具

时间:2019-02-16
本文章向大家介绍Qt实现文件分类小工具,主要包括Qt实现文件分类小工具使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、工具说明:

项目中用到需要经常分类数据,就使用Qt实现了一个文件分类小工具,选中文件夹后会按后缀名字自动创建一个文件夹把后缀相同的文件放在一个文件夹中。软件截图及效果如下:

二、实现代码

/**********************mainwindow.h*******************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButtonInput_clicked();

    void on_pushButtonOutput_clicked();
private:
    QFileInfoList getFileList(QString path);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
/**********************mainwindow.cpp*******************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>
#include <QFont>
#pragma execution_character_set("utf-8")

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_pushButtonInput_clicked()
{
    QString filePath = QFileDialog::getExistingDirectory(this,tr("open directory"),"/home",
                                                         QFileDialog::ShowDirsOnly
                                                         | QFileDialog::DontResolveSymlinks);
    ui->lineEditInput->setText(filePath);
    ui->lineEditInput->setEnabled(false);
}

void MainWindow::on_pushButtonOutput_clicked()
{
    QString outPath = QFileDialog::getExistingDirectory(this,tr("open directory"),"/home",
                                                         QFileDialog::ShowDirsOnly
                                                         | QFileDialog::DontResolveSymlinks);
    ui->lineEditOutput->setText(outPath);
    ui->lineEditOutput->setEnabled(false);

    ui->tableWidget->clear();

    QString inputPath = ui->lineEditInput->text();
    QFileInfoList tempFileInfoList = getFileList(inputPath);
    for(int i=0; i<tempFileInfoList.size(); i++)
    {
        QFileInfo tempFileInfo = tempFileInfoList.at(i);
        QString tempSuffix = tempFileInfo.completeSuffix();
        if(tempSuffix.size() < 1)
        {
            tempSuffix = "fileNoSuffix";
        }
        QString tempOutPath = outPath + "/" + tempSuffix;
        QDir tmpDir(tempOutPath);
        if(!tmpDir.exists())
        {
            tmpDir.mkpath(tempOutPath);
        }
        QString tmpFileName = tempFileInfo.absoluteFilePath();
        QString fileName = tempFileInfo.fileName();
        tempOutPath = tempOutPath+"/"+fileName;
//        qDebug() << tmpFileName << endl;
        // 注意QFile::copy的使用,我开始以为第二个参数传文件夹名字,
        // 一直复制不成功,才知道是要传具体的文件名字才行
        QFile::copy(tmpFileName,tempOutPath);
        QTableWidgetItem *suffixItem = new QTableWidgetItem();
        suffixItem->setText(tempSuffix);
        QTableWidgetItem *outpathItem = new QTableWidgetItem();
        outpathItem->setText(tempOutPath);
        outpathItem->setToolTip(tempOutPath);
        ui->tableWidget->insertRow(i);
        ui->tableWidget->setItem(i,0,suffixItem);
        ui->tableWidget->setItem(i,1,outpathItem);
        ui->tableWidget->setAutoScroll(true);
        ui->statusBar->showMessage("choose data....");

        QFont font("Times",18,QFont::Black);
        ui->statusBar->setFont(font);
    }
    QMessageBox::information(NULL,"title","choose over");
    ui->statusBar->showMessage("choose over");
}

QFileInfoList MainWindow::getFileList(QString path)
{
    QDir dir(path);
    QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    QFileInfoList folderList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);

    for(int i=0; i<folderList.size(); i++)
    {
        QString name = folderList.at(i).absoluteFilePath();
        QFileInfoList chileFileList = getFileList(name);
        fileList.append(chileFileList);
    }
    return fileList;
}

/**********************main.cpp*******************/
#include "mainwindow.h"
#include <QApplication>
#include <QTextCodec>
#pragma execution_character_set("utf-8")
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
#else
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
#endif
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

代码很简单不再加注释了。需要注意的地方就是QFile::copy()的使用,代码中已做注释,不再赘述。