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 = );
- ~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(,);
- 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(,new QStandardItem(QObject::tr("文件名")));
- model->setHorizontalHeaderItem(,new QStandardItem(QObject::tr("所在位置")));
- model->setHorizontalHeaderItem(,new QStandardItem(QObject::tr("大小(字节)")));
- model->sort(,Qt::DescendingOrder);//感觉没用上
- tableView->setModel(model);
- //设置表格属性
- tableView->setColumnWidth(,);
- tableView->setColumnWidth(,);
- tableView->setColumnWidth(,);
- //设置选中为整行选中
- 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(,model->rowCount());
- }
- //初始化状态栏
- void MainWindow::initStatustBar()
- {
- QStatusBar *bar = ui->statusBar; //获取状态栏
- firstStatust = new QLabel; //新建标签
- firstStatust->setMinimumSize(,); //设置标签最小尺寸
- 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=;
- 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 = ;
- for(i=mH.begin();i!=mH.end();i++)
- {
- if(mH.count(i.key())>)
- {
- //qDebug()<<jRows<<"----------"<<i.key()<<"------"<<i.value();
- QFileInfo fileInfo = QFileInfo(i.value());
- model->setItem(jRows,,new QStandardItem(fileInfo.fileName()));
- model->setItem(jRows,,new QStandardItem(i.value()));
- model->setItem(jRows,,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 = ;
- while(dir_iterator.hasNext())
- {
- dir_iterator.next();
- QString filePath = dir_iterator.filePath();
- QString fileName = dir_iterator.fileName();
- QDir dir(filePath);
- if(dir.count() == )//文件==0
- {
- model->setItem(jRows,,new QStandardItem(fileName));
- model->setItem(jRows,,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 = ;
- while(dir_iterator.hasNext())
- {
- dir_iterator.next();
- QFileInfo file_info = dir_iterator.fileInfo();
- model->setItem(jRows,,new QStandardItem(file_info.fileName()));
- model->setItem(jRows,,new QStandardItem(file_info.filePath()));
- model->setItem(jRows,,new QStandardItem(QString::number(file_info.size())));
- jRows++;
- }
- this->setEndStatust();
- }
- // 单个/多个 删除操作
- void MainWindow::slotDelFile()
- {
- QItemSelectionModel *selections = tableView->selectionModel();
- QModelIndexList selected = selections->selectedRows();
- if(selected.size()>)
- {
- for (int i=; i < selected.size(); i++)
- {
- int index = selected.at(i).row()-i;//因为model是动态变化的
- QFile file(model->item(index,)->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()>)
- {
- //设置全选
- QItemSelectionModel *selectionsModel = tableView->selectionModel();
- QModelIndex topLeft = model->index(,,QModelIndex());
- QModelIndex bottomRight = model->index(model->rowCount()-,,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之课外实践——文件操作(简单清道夫)的更多相关文章
- paip.c++ qt 目录遍历以及文件操作
paip.c++ qt 目录遍历以及文件操作 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/a ...
- java IO文件操作简单基础入门例子,IO流其实没那么难
IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...
- 4.关于QT中的QFile文件操作,QBuffer,Label上添加QPixmap,QByteArray和QString之间的区别,QTextStream和QDataStream的区别,QT内存映射(
新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...
- 4.关于QT中的QFile文件操作,QBuffer,Label上加入QPixmap,QByteArray和QString之间的差别,QTextStream和QDataStream的差别,QT内存映射(
新建项目13IO 13IO.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gui widgets network CON ...
- PHP_File文件操作简单常用函数
php测试文件 <?php header("Content-type:text/html;charest=utf-8");$fileDir='Upload/File/cont ...
- Qt5:Qt文件操作类 QFile
在QT中,操作文件一般不使用C++提供的文件操作类 , 因为操作文件的时候,要用到C++提供的 string 类,而在QT中使用的是Qt自己实现的一个string类 QString .在Qt中使用C+ ...
- Python档案袋( 命令行操作 及 Os与Shutil文件操作补充 )
调用系统命令 import os #调用系统命令,输出只能输出到屏幕上,不能用变量接收 os.system("ipconfig") #调用系统命令,并把执行结果存到变量中 res= ...
- python基础知识-7-内存、深浅、文件操作
python其他知识目录 1.一些对内存深入理解的案例 以下列举列表,列表/字典/集合这些可变类型都是一样的原理 变量是个地址,指向存储数据的内存空间的地址,它的实质就相当于c语言里的指针.变量和数据 ...
- 第32课 Qt中的文件操作
1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...
随机推荐
- TinyXML:一个优秀的C++ XML解析器
//-------------------------------------------------------------------------------------------------- ...
- AsyncTask下载网络图片的简单应用
1.imageTest package lpc.com.asynctaskdemo; import android.app.Activity; import android.graphics.Bitm ...
- python第十二天-----RabbitMQ
有一位小伙伴说让我去A站写博客可能会有很多人喜欢,真是搞不懂,北方哪里有卖萌?北方默认状态就是这么萌的!再者说了,这明明就是很专注于技术的博客嘛,能不能严肃点!知不知道什么叫帧? 学习到了数据库的相关 ...
- FragmentTabHost
FragmentTabHost public class FragmentTabHost extends TabHost implements TabHost.OnTabChangeListener ...
- 前端---HTML
HTML基础 本章内容: 简介 HTML定义 标签定义和属性 HTML5基本结构 HTML5字符集 <head>标签 <title> <base/> <lin ...
- oracle数据学习第二天
今天主要加强了对oracle数据库的数据类型一些相关函数的学习 (一)char和varchar2 字符串函数 <1>concat(char1,char2)字符串连接函数,用于连接两个字 ...
- RecycleView在eclipse的初体验
在sdk中找到v7包 \sdk\extras\android\support\v7\recyclerview 导入工程 Import\Android\Existing Android Code Int ...
- handlebars
Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模版)的 ...
- Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future
CountDownLatch.CyclicBarrier.Semaphore.Callable.Future 都位于java.util.concurrent包下,其中CountDownLatch.C ...
- 斯坦福第七课:正则化(Regularization)
7.1 过拟合的问题 7.2 代价函数 7.3 正则化线性回归 7.4 正则化的逻辑回归模型 7.1 过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...