Qt之课外实践——文件操作(简单清道夫)

说明:这个小项目是关于文件操作的。主要的功能有:重复文件的查找(根据文件的大小),说白了,就是讲大小相同的文件在一起显示出来,供用户自由的选择删除。这个360云盘里的文件去重还差的很远。还有空文件夹的查找(我们的思想是:如果一个目录下面只有.和..2个目录,则,这个文件夹就是空的。但是我们不包含文件里面套有空文件夹。),以及垃圾文件的查找(根据文件的后缀,简单判断的。)。

窗体主界面:

image

首先程序运行前,会弹出提示对话框。

image

代码如下:

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H



#include <QLabel>

#include <QList>

#include <QMainWindow>

#include <QModelIndex>

#include <QMultiHash>

#include <QStandardItemModel>

class QTableView;



namespace Ui {

class MainWindow;

}



class MainWindow : public QMainWindow

{

    Q_OBJECT



public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

    QString FunGetPath();//得到文件夹路径

    void FunClear();//清空函数

    void initStatustBar();//初始化状态栏

    void setStarStatust();//设置开始状态栏

    void setEndStatust();//设置结束状态栏

private:

    Ui::MainWindow *ui;

    QTableView *tableView;

    QStandardItemModel *model;

    QMultiHash<int,QString> mH;

    QList<int> fileSize;

    QLabel *firstStatust;



public slots:

    void duplicateFile();//重复文件

    void emptyFile();//空文件

    void junkFile();//垃圾文件

    void slotDelFile();//删除文件

    void delAllFile();//全部删除

};



#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>

#include <QMessageBox>

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.resize(800,500);

    w.show();    

    return a.exec();

}

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"



#include <QAction>

#include <QDebug>

#include <QDir>

#include <QDirIterator>

#include <QFileDialog>

#include <QFileInfo>

#include <QItemSelectionModel>

#include <QGridLayout>

#include <QMap>

#include <QMessageBox>

#include <QModelIndex>

#include <QStandardItemModel>

#include <QStatusBar>

#include <QTableView>



MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);



    tableView = new QTableView(ui->centralWidget);

    QGridLayout *layout = new QGridLayout();

    layout->addWidget(tableView);

    ui->centralWidget->setLayout(layout);



    //添加工具栏

    QAction *hashFile = new QAction(tr("重复文件清理"),ui->mainToolBar);

    QAction *emptyFile = new QAction(tr("空文件夹清理"),ui->mainToolBar);

    QAction *junkFile = new QAction(tr("垃圾文件清理"),ui->mainToolBar);

    QAction *delFile = new QAction(tr("文件删除"),ui->mainToolBar);

    QAction *delAllFile = new QAction(tr("全部删除"),ui->mainToolBar);



    ui->mainToolBar->addAction(hashFile);

    ui->mainToolBar->addAction(emptyFile);

    ui->mainToolBar->addAction(junkFile);

    ui->mainToolBar->addSeparator();

    ui->mainToolBar->addAction(delFile);

    ui->mainToolBar->addAction(delAllFile);



    connect(hashFile,SIGNAL(triggered()),this,SLOT(duplicateFile()));//文件去重

    connect(emptyFile,SIGNAL(triggered()),this,SLOT(emptyFile()));//空文件夹

    connect(junkFile,SIGNAL(triggered()),this,SLOT(junkFile()));//垃圾文件



    connect(delFile,SIGNAL(triggered()),this,SLOT(slotDelFile()));//单、多文件删除

    connect(delAllFile,SIGNAL(triggered()),this,SLOT(delAllFile()));//全部删除

    //准备数据模型

    model = new QStandardItemModel();

    model->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("文件名")));

    model->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("所在位置")));

    model->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("大小(字节)")));

    model->sort(2,Qt::DescendingOrder);//感觉没用上

    tableView->setModel(model);

    //设置表格属性

    tableView->setColumnWidth(0,150);

    tableView->setColumnWidth(1,550);

    tableView->setColumnWidth(2,70);

    //设置选中为整行选中

    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    //设置表格单元格为只读

    tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);



    QMessageBox::warning(this,tr("警告"),

                         tr("非计算机专业人士,请在计算机专业人士陪同的情况下,使用此软件。请做到三思而后删!"),

                         QMessageBox::Yes);



    this->initStatustBar();

}



MainWindow::~MainWindow()

{

    delete ui;

}

//获取文件夹的路径

QString MainWindow::FunGetPath()

{

    QString path=QFileDialog::getExistingDirectory(NULL, tr("选择文件夹"),"D:\\",QFileDialog::ShowDirsOnly);

    bool biag = true;

    //判断路径是否存在

    while(biag)

    {

        if(path.isEmpty())

        {

            if(QMessageBox::Yes == QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes))

            {

                path=QFileDialog::getExistingDirectory(NULL, tr("选择文件夹"),"D:\\",QFileDialog::ShowDirsOnly);

            }

        }

        else

        {

            biag = false;

        }

    }

    return path;

}



//清空函数

void MainWindow::FunClear()

{

    //3个清空操作

    mH.clear();

    fileSize.clear();

    model->removeRows(0,model->rowCount());

}

//初始化状态栏

void MainWindow::initStatustBar()

{

    QStatusBar *bar = ui->statusBar; //获取状态栏

    firstStatust = new QLabel; //新建标签

    firstStatust->setMinimumSize(150,20); //设置标签最小尺寸

    bar->addWidget(firstStatust);

    firstStatust->setText(tr("欢迎使用文件一扫光!")); //初始化内容

}

//设置开始状态栏

void MainWindow::setStarStatust()

{

    firstStatust->setText(tr("<font color=red>文件扫描中……</font>"));

}

//设置结束状态栏

void MainWindow::setEndStatust()

{

    firstStatust->setText(tr("<font color=Blue>文件扫描完毕。</font>"));

}



//重复文件

void MainWindow::duplicateFile()

{

    this->FunClear();

    this->setStarStatust();//这2句换下位置就不行了

    QString path = this->FunGetPath();

    QDir dir(path);

    if(!dir.exists())

    {

        QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);

        return;

    }

    //定义迭代器并设置过滤器

    QDirIterator dir_iterator(path,

                              QDir::Files | QDir::NoSymLinks,

                              QDirIterator::Subdirectories);

    int num=0;

    while(dir_iterator.hasNext())

    {

        dir_iterator.next();

        QFileInfo file_info = dir_iterator.fileInfo();

        if(file_info.isFile())

        {

            //qDebug()<<num++<<"-----"<<file_info.absoluteFilePath();

            if(!fileSize.contains(file_info.size()))

            {

                fileSize.append(file_info.size());

            }

            mH.insertMulti(file_info.size(),file_info.absoluteFilePath());

        }

    }

    //qDebug()<<"over......";

    //qSort(fileSize.begin(),fileSize.end(),qGreater<int>());

    QMultiHash<int,QString>::iterator i;

    int jRows = 0;

    for(i=mH.begin();i!=mH.end();i++)

    {

        if(mH.count(i.key())>1)

        {

            //qDebug()<<jRows<<"----------"<<i.key()<<"------"<<i.value();

            QFileInfo fileInfo = QFileInfo(i.value());

            model->setItem(jRows,0,new QStandardItem(fileInfo.fileName()));

            model->setItem(jRows,1,new QStandardItem(i.value()));

            model->setItem(jRows,2,new QStandardItem(QString::number(i.key())));

            jRows++;

        }

    }

    this->setEndStatust();

}



//空文件夹清理

void MainWindow::emptyFile()

{

    this->FunClear();

    this->setStarStatust();



    QString path = this->FunGetPath();

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);

        return;

    }

    //定义迭代器并设置过滤器

    QDirIterator dir_iterator(path,QDirIterator::Subdirectories);

    int jRows = 0;



    while(dir_iterator.hasNext())

    {

        dir_iterator.next();



        QString filePath = dir_iterator.filePath();

        QString fileName = dir_iterator.fileName();



        QDir dir(filePath);

        if(dir.count() == 2)//文件==0

        {

            model->setItem(jRows,0,new QStandardItem(fileName));

            model->setItem(jRows,1,new QStandardItem(filePath));

            jRows++;

            dir_iterator.next();//跳过/.目录

            //dir.rmdir(".");

        }

    }

    this->setEndStatust();

}



//垃圾文件操作

void MainWindow::junkFile()

{

    this->FunClear();

    this->setStarStatust();



    QString path=this->FunGetPath();

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);

        return;

    }

    //获取所选文件类型过滤器

    QStringList filters;

    filters<<"*.tmp"<<"*._mp"<<"*.log"<<"*.gid"<<"*.chk"<<"*.old";

    //定义迭代器并设置过滤器

    QDirIterator dir_iterator(path,

                              filters,

                              QDir::Files | QDir::NoSymLinks,

                              QDirIterator::Subdirectories);

    int jRows = 0;

    while(dir_iterator.hasNext())

    {

        dir_iterator.next();

        QFileInfo file_info = dir_iterator.fileInfo();

        model->setItem(jRows,0,new QStandardItem(file_info.fileName()));

        model->setItem(jRows,1,new QStandardItem(file_info.filePath()));

        model->setItem(jRows,2,new QStandardItem(QString::number(file_info.size())));

        jRows++;

    }

    this->setEndStatust();

}



// 单个/多个 删除操作

void MainWindow::slotDelFile()

{

    QItemSelectionModel *selections = tableView->selectionModel();

    QModelIndexList selected = selections->selectedRows();

    if(selected.size()>0)

    {

        for (int i=0; i < selected.size(); i++)

        {

            int index = selected.at(i).row()-i;//因为model是动态变化的

            QFile file(model->item(index,1)->text());

            QFileInfo fileInfo(file);

            QDir dir(fileInfo.filePath());

            if(fileInfo.isDir())//如果是目录

            {

                //qDebug()<<dir.absolutePath();

                dir.rmdir(".");//删除空文件目录

            }

            else

            {

                if(file.exists())

                {

                    //qDebug()<<model->item(index,1)->text();

                    file.remove();//删除文件(重复和垃圾)

                }

            }

            //qDebug()<<model->item(index,1)->text();

            model->removeRow(index);

        }

    }

    else

    {

        QMessageBox::warning(this,tr("警告"),tr("请先进行文件类型的处理选择,然后在表格里选择要删除的文件"),QMessageBox::Yes);

    }    

}



//全部删除

void MainWindow::delAllFile()

{

    //qDebug()<<model->rowCount();

    if(model->rowCount()>0)

    {

        //设置全选

        QItemSelectionModel *selectionsModel = tableView->selectionModel();

        QModelIndex topLeft = model->index(0,0,QModelIndex());

        QModelIndex bottomRight = model->index(model->rowCount()-1,2,QModelIndex());

        QItemSelection selection(topLeft,bottomRight);

        selectionsModel->select(selection,QItemSelectionModel::Select);



        if(QMessageBox::Yes == QMessageBox::question(this,tr("提问"),tr("您确定要删除下面所有的文件吗?Yes 确定,No 取消"),QMessageBox::Yes,QMessageBox::No))

        {

            this->slotDelFile();//调用 单个/多个 删除函数

            //qDebug()<<"Del...OK!";

        }

    }

    else

    {

        QMessageBox::warning(this,tr("警告"),tr("请先进行文件类型的处理选择,然后在表格里选择要删除的文件"),QMessageBox::Yes);

    }

}

备注:以上这个程序还有很多的不足之处,贴出来,是因为里面有些Qt的知识还是可以借鉴学习的。

你可能感兴趣的:(文件操作)