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

时间: 2024-10-10 23:26:23

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

C++ 文件操作简单总结(1)

C++文件流: fstream // 文件流 ifstream // 输入文件流 ofstream // 输出文件流 //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1<

C++ 文件操作简单总结

C++文件流: fstream // 文件流 ifstream // 输入文件流 ofstream // 输出文件流 //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1<

java IO文件操作简单基础入门例子,IO流其实没那么难

IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 try {             File inputFile = new File(args[0]);             if (!inputFile.exists()) {                 System.out.println("源文件不存在,程序终止");

4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(

 新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CONFIG += C++11 MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H   #include <QWidget>   class MyWidget : public QWidget {     Q_OBJECT public:     expli

PHP_File文件操作简单常用函数

php测试文件 <?php header("Content-type:text/html;charest=utf-8");$fileDir='Upload/File/content.txt';echo '文件路径:'.$fileDir.'<br/>';echo '路径目录|dirname():'.dirname($fileDir).'<br/>';echo '路径文件名|basename():'.basename($fileDir).'<br/>

Linux基础命令,目录文件操作,vi编辑器详解

一.linux基础命令 linux命令的执行必须依赖于shell命令解释器.shell实际上是在linux系统中运行的一种特殊程序,它位于操作系统内核与用户之间,负责接收用户输入的命令并进行解释,将需要执行的操作传递给系统内核执行,shell在用户和内核之间充当了一个"翻译官"的角色.当用户登录到linux系统时,会自动加载一个shell程序,以便给用户提供可以输入命令的操作系统. 1.首先介绍一下快捷键 Tab键:用来补齐命令字或文件.目录名,例如输入"ifcon"

C++ 文件的简单操作

=================================================================== 编写程序时,很多时候都要对文件进行操作,比如从文件中读取数据,通过程序将一些数据保存到文件中等等.. 以下是c++对文件的一些简单操作. =================================================================== 一.文件输出 要将程序中的数据输出到文件中,一般需要以下5个步骤: ① 包含fstream

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

android 简单文件操作

1.布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orient