zoukankan      html  css  js  c++  java
  • 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的知识还是可以借鉴学习的。

  • 相关阅读:
    Docker 安装各种环境
    N级树形菜单封装
    一个周期算出所有高电平的个数
    DDR3新版(3):DDR3自动读写控制器
    DDR3_新版(2):IP核再封装
    数电(6):时序逻辑电路
    Vue表单那些事
    liunx环境修改minio默认端口和后台启动
    liunx 后台启动mongodb服务
    liunx安装和部署nacos配置中心
  • 原文地址:https://www.cnblogs.com/zi-xing/p/4197204.html
Copyright © 2011-2022 走看看