首页 > 代码库 > Qt之课外实践——文件操作(简单清道夫)

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

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

窗体主界面:

技术分享

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

技术分享

代码如下:

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_OBJECTpublic:    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的知识还是可以借鉴学习的。

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