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

窗体主界面:

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

代码如下:

mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QLabel>
  5. #include <QList>
  6. #include <QMainWindow>
  7. #include <QModelIndex>
  8. #include <QMultiHash>
  9. #include <QStandardItemModel>
  10. class QTableView;
  11.  
  12. namespace Ui {
  13. class MainWindow;
  14. }
  15.  
  16. class MainWindow : public QMainWindow
  17. {
  18. Q_OBJECT
  19.  
  20. public:
  21. explicit MainWindow(QWidget *parent = );
  22. ~MainWindow();
  23. QString FunGetPath();//得到文件夹路径
  24. void FunClear();//清空函数
  25. void initStatustBar();//初始化状态栏
  26. void setStarStatust();//设置开始状态栏
  27. void setEndStatust();//设置结束状态栏
  28. private:
  29. Ui::MainWindow *ui;
  30. QTableView *tableView;
  31. QStandardItemModel *model;
  32. QMultiHash<int,QString> mH;
  33. QList<int> fileSize;
  34. QLabel *firstStatust;
  35.  
  36. public slots:
  37. void duplicateFile();//重复文件
  38. void emptyFile();//空文件
  39. void junkFile();//垃圾文件
  40. void slotDelFile();//删除文件
  41. void delAllFile();//全部删除
  42. };
  43.  
  44. #endif // MAINWINDOW_H

main.cpp

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include <QMessageBox>
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. MainWindow w;
  8. w.resize(,);
  9. w.show();
  10. return a.exec();
  11. }

mainwindow.cpp

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. #include <QAction>
  5. #include <QDebug>
  6. #include <QDir>
  7. #include <QDirIterator>
  8. #include <QFileDialog>
  9. #include <QFileInfo>
  10. #include <QItemSelectionModel>
  11. #include <QGridLayout>
  12. #include <QMap>
  13. #include <QMessageBox>
  14. #include <QModelIndex>
  15. #include <QStandardItemModel>
  16. #include <QStatusBar>
  17. #include <QTableView>
  18.  
  19. MainWindow::MainWindow(QWidget *parent) :
  20. QMainWindow(parent),
  21. ui(new Ui::MainWindow)
  22. {
  23. ui->setupUi(this);
  24.  
  25. tableView = new QTableView(ui->centralWidget);
  26. QGridLayout *layout = new QGridLayout();
  27. layout->addWidget(tableView);
  28. ui->centralWidget->setLayout(layout);
  29.  
  30. //添加工具栏
  31. QAction *hashFile = new QAction(tr("重复文件清理"),ui->mainToolBar);
  32. QAction *emptyFile = new QAction(tr("空文件夹清理"),ui->mainToolBar);
  33. QAction *junkFile = new QAction(tr("垃圾文件清理"),ui->mainToolBar);
  34. QAction *delFile = new QAction(tr("文件删除"),ui->mainToolBar);
  35. QAction *delAllFile = new QAction(tr("全部删除"),ui->mainToolBar);
  36.  
  37. ui->mainToolBar->addAction(hashFile);
  38. ui->mainToolBar->addAction(emptyFile);
  39. ui->mainToolBar->addAction(junkFile);
  40. ui->mainToolBar->addSeparator();
  41. ui->mainToolBar->addAction(delFile);
  42. ui->mainToolBar->addAction(delAllFile);
  43.  
  44. connect(hashFile,SIGNAL(triggered()),this,SLOT(duplicateFile()));//文件去重
  45. connect(emptyFile,SIGNAL(triggered()),this,SLOT(emptyFile()));//空文件夹
  46. connect(junkFile,SIGNAL(triggered()),this,SLOT(junkFile()));//垃圾文件
  47.  
  48. connect(delFile,SIGNAL(triggered()),this,SLOT(slotDelFile()));//单、多文件删除
  49. connect(delAllFile,SIGNAL(triggered()),this,SLOT(delAllFile()));//全部删除
  50. //准备数据模型
  51. model = new QStandardItemModel();
  52. model->setHorizontalHeaderItem(,new QStandardItem(QObject::tr("文件名")));
  53. model->setHorizontalHeaderItem(,new QStandardItem(QObject::tr("所在位置")));
  54. model->setHorizontalHeaderItem(,new QStandardItem(QObject::tr("大小(字节)")));
  55. model->sort(,Qt::DescendingOrder);//感觉没用上
  56. tableView->setModel(model);
  57. //设置表格属性
  58. tableView->setColumnWidth(,);
  59. tableView->setColumnWidth(,);
  60. tableView->setColumnWidth(,);
  61. //设置选中为整行选中
  62. tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  63. //设置表格单元格为只读
  64. tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
  65.  
  66. QMessageBox::warning(this,tr("警告"),
  67. tr("非计算机专业人士,请在计算机专业人士陪同的情况下,使用此软件。请做到三思而后删!"),
  68. QMessageBox::Yes);
  69.  
  70. this->initStatustBar();
  71. }
  72.  
  73. MainWindow::~MainWindow()
  74. {
  75. delete ui;
  76. }
  77. //获取文件夹的路径
  78. QString MainWindow::FunGetPath()
  79. {
  80. QString path=QFileDialog::getExistingDirectory(NULL, tr("选择文件夹"),"D:\\",QFileDialog::ShowDirsOnly);
  81. bool biag = true;
  82. //判断路径是否存在
  83. while(biag)
  84. {
  85. if(path.isEmpty())
  86. {
  87. if(QMessageBox::Yes == QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes))
  88. {
  89. path=QFileDialog::getExistingDirectory(NULL, tr("选择文件夹"),"D:\\",QFileDialog::ShowDirsOnly);
  90. }
  91. }
  92. else
  93. {
  94. biag = false;
  95. }
  96. }
  97. return path;
  98. }
  99.  
  100. //清空函数
  101. void MainWindow::FunClear()
  102. {
  103. //3个清空操作
  104. mH.clear();
  105. fileSize.clear();
  106. model->removeRows(,model->rowCount());
  107. }
  108. //初始化状态栏
  109. void MainWindow::initStatustBar()
  110. {
  111. QStatusBar *bar = ui->statusBar; //获取状态栏
  112. firstStatust = new QLabel; //新建标签
  113. firstStatust->setMinimumSize(,); //设置标签最小尺寸
  114. bar->addWidget(firstStatust);
  115. firstStatust->setText(tr("欢迎使用文件一扫光!")); //初始化内容
  116. }
  117. //设置开始状态栏
  118. void MainWindow::setStarStatust()
  119. {
  120. firstStatust->setText(tr("<font color=red>文件扫描中……</font>"));
  121. }
  122. //设置结束状态栏
  123. void MainWindow::setEndStatust()
  124. {
  125. firstStatust->setText(tr("<font color=Blue>文件扫描完毕。</font>"));
  126. }
  127.  
  128. //重复文件
  129. void MainWindow::duplicateFile()
  130. {
  131. this->FunClear();
  132. this->setStarStatust();//这2句换下位置就不行了
  133. QString path = this->FunGetPath();
  134. QDir dir(path);
  135. if(!dir.exists())
  136. {
  137. QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);
  138. return;
  139. }
  140. //定义迭代器并设置过滤器
  141. QDirIterator dir_iterator(path,
  142. QDir::Files | QDir::NoSymLinks,
  143. QDirIterator::Subdirectories);
  144. int num=;
  145. while(dir_iterator.hasNext())
  146. {
  147. dir_iterator.next();
  148. QFileInfo file_info = dir_iterator.fileInfo();
  149. if(file_info.isFile())
  150. {
  151. //qDebug()<<num++<<"-----"<<file_info.absoluteFilePath();
  152. if(!fileSize.contains(file_info.size()))
  153. {
  154. fileSize.append(file_info.size());
  155. }
  156. mH.insertMulti(file_info.size(),file_info.absoluteFilePath());
  157. }
  158. }
  159. //qDebug()<<"over......";
  160. //qSort(fileSize.begin(),fileSize.end(),qGreater<int>());
  161. QMultiHash<int,QString>::iterator i;
  162. int jRows = ;
  163. for(i=mH.begin();i!=mH.end();i++)
  164. {
  165. if(mH.count(i.key())>)
  166. {
  167. //qDebug()<<jRows<<"----------"<<i.key()<<"------"<<i.value();
  168. QFileInfo fileInfo = QFileInfo(i.value());
  169. model->setItem(jRows,,new QStandardItem(fileInfo.fileName()));
  170. model->setItem(jRows,,new QStandardItem(i.value()));
  171. model->setItem(jRows,,new QStandardItem(QString::number(i.key())));
  172. jRows++;
  173. }
  174. }
  175. this->setEndStatust();
  176. }
  177.  
  178. //空文件夹清理
  179. void MainWindow::emptyFile()
  180. {
  181. this->FunClear();
  182. this->setStarStatust();
  183.  
  184. QString path = this->FunGetPath();
  185. //判断路径是否存在
  186. QDir dir(path);
  187. if(!dir.exists())
  188. {
  189. QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);
  190. return;
  191. }
  192. //定义迭代器并设置过滤器
  193. QDirIterator dir_iterator(path,QDirIterator::Subdirectories);
  194. int jRows = ;
  195.  
  196. while(dir_iterator.hasNext())
  197. {
  198. dir_iterator.next();
  199.  
  200. QString filePath = dir_iterator.filePath();
  201. QString fileName = dir_iterator.fileName();
  202.  
  203. QDir dir(filePath);
  204. if(dir.count() == )//文件==0
  205. {
  206. model->setItem(jRows,,new QStandardItem(fileName));
  207. model->setItem(jRows,,new QStandardItem(filePath));
  208. jRows++;
  209. dir_iterator.next();//跳过/.目录
  210. //dir.rmdir(".");
  211. }
  212. }
  213. this->setEndStatust();
  214. }
  215.  
  216. //垃圾文件操作
  217. void MainWindow::junkFile()
  218. {
  219. this->FunClear();
  220. this->setStarStatust();
  221.  
  222. QString path=this->FunGetPath();
  223. //判断路径是否存在
  224. QDir dir(path);
  225. if(!dir.exists())
  226. {
  227. QMessageBox::warning(this,tr("警告"),tr("选择的文件夹路径不存在,请重新选择有效的文件夹。"),QMessageBox::Yes);
  228. return;
  229. }
  230. //获取所选文件类型过滤器
  231. QStringList filters;
  232. filters<<"*.tmp"<<"*._mp"<<"*.log"<<"*.gid"<<"*.chk"<<"*.old";
  233. //定义迭代器并设置过滤器
  234. QDirIterator dir_iterator(path,
  235. filters,
  236. QDir::Files | QDir::NoSymLinks,
  237. QDirIterator::Subdirectories);
  238. int jRows = ;
  239. while(dir_iterator.hasNext())
  240. {
  241. dir_iterator.next();
  242. QFileInfo file_info = dir_iterator.fileInfo();
  243. model->setItem(jRows,,new QStandardItem(file_info.fileName()));
  244. model->setItem(jRows,,new QStandardItem(file_info.filePath()));
  245. model->setItem(jRows,,new QStandardItem(QString::number(file_info.size())));
  246. jRows++;
  247. }
  248. this->setEndStatust();
  249. }
  250.  
  251. // 单个/多个 删除操作
  252. void MainWindow::slotDelFile()
  253. {
  254. QItemSelectionModel *selections = tableView->selectionModel();
  255. QModelIndexList selected = selections->selectedRows();
  256. if(selected.size()>)
  257. {
  258. for (int i=; i < selected.size(); i++)
  259. {
  260. int index = selected.at(i).row()-i;//因为model是动态变化的
  261. QFile file(model->item(index,)->text());
  262. QFileInfo fileInfo(file);
  263. QDir dir(fileInfo.filePath());
  264. if(fileInfo.isDir())//如果是目录
  265. {
  266. //qDebug()<<dir.absolutePath();
  267. dir.rmdir(".");//删除空文件目录
  268. }
  269. else
  270. {
  271. if(file.exists())
  272. {
  273. //qDebug()<<model->item(index,1)->text();
  274. file.remove();//删除文件(重复和垃圾)
  275. }
  276. }
  277. //qDebug()<<model->item(index,1)->text();
  278. model->removeRow(index);
  279. }
  280. }
  281. else
  282. {
  283. QMessageBox::warning(this,tr("警告"),tr("请先进行文件类型的处理选择,然后在表格里选择要删除的文件"),QMessageBox::Yes);
  284. }
  285. }
  286.  
  287. //全部删除
  288. void MainWindow::delAllFile()
  289. {
  290. //qDebug()<<model->rowCount();
  291. if(model->rowCount()>)
  292. {
  293. //设置全选
  294. QItemSelectionModel *selectionsModel = tableView->selectionModel();
  295. QModelIndex topLeft = model->index(,,QModelIndex());
  296. QModelIndex bottomRight = model->index(model->rowCount()-,,QModelIndex());
  297. QItemSelection selection(topLeft,bottomRight);
  298. selectionsModel->select(selection,QItemSelectionModel::Select);
  299.  
  300. if(QMessageBox::Yes == QMessageBox::question(this,tr("提问"),tr("您确定要删除下面所有的文件吗?Yes 确定,No 取消"),QMessageBox::Yes,QMessageBox::No))
  301. {
  302. this->slotDelFile();//调用 单个/多个 删除函数
  303. //qDebug()<<"Del...OK!";
  304. }
  305. }
  306. else
  307. {
  308. QMessageBox::warning(this,tr("警告"),tr("请先进行文件类型的处理选择,然后在表格里选择要删除的文件"),QMessageBox::Yes);
  309. }
  310. }

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

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

  1. paip.c++ qt 目录遍历以及文件操作

    paip.c++ qt 目录遍历以及文件操作 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/a ...

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

    IO是JAVASE中非常重要的一块,是面向对象的完美体现,深入学习IO,你将可以领略到很多面向对象的思想.今天整理了一份适合初学者学习的简单例子,让大家可以更深刻的理解IO流的具体操作. 1.文件拷贝 ...

  3. 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. 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 ...

  5. PHP_File文件操作简单常用函数

    php测试文件 <?php header("Content-type:text/html;charest=utf-8");$fileDir='Upload/File/cont ...

  6. Qt5:Qt文件操作类 QFile

    在QT中,操作文件一般不使用C++提供的文件操作类 , 因为操作文件的时候,要用到C++提供的 string 类,而在QT中使用的是Qt自己实现的一个string类 QString .在Qt中使用C+ ...

  7. Python档案袋( 命令行操作 及 Os与Shutil文件操作补充 )

    调用系统命令 import os #调用系统命令,输出只能输出到屏幕上,不能用变量接收 os.system("ipconfig") #调用系统命令,并把执行结果存到变量中 res= ...

  8. python基础知识-7-内存、深浅、文件操作

    python其他知识目录 1.一些对内存深入理解的案例 以下列举列表,列表/字典/集合这些可变类型都是一样的原理 变量是个地址,指向存储数据的内存空间的地址,它的实质就相当于c语言里的指针.变量和数据 ...

  9. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

随机推荐

  1. TinyXML:一个优秀的C++ XML解析器

    //-------------------------------------------------------------------------------------------------- ...

  2. AsyncTask下载网络图片的简单应用

    1.imageTest package lpc.com.asynctaskdemo; import android.app.Activity; import android.graphics.Bitm ...

  3. python第十二天-----RabbitMQ

    有一位小伙伴说让我去A站写博客可能会有很多人喜欢,真是搞不懂,北方哪里有卖萌?北方默认状态就是这么萌的!再者说了,这明明就是很专注于技术的博客嘛,能不能严肃点!知不知道什么叫帧? 学习到了数据库的相关 ...

  4. FragmentTabHost

    FragmentTabHost public class FragmentTabHost  extends TabHost implements TabHost.OnTabChangeListener ...

  5. 前端---HTML

    HTML基础 本章内容: 简介 HTML定义 标签定义和属性 HTML5基本结构 HTML5字符集 <head>标签 <title> <base/> <lin ...

  6. oracle数据学习第二天

    今天主要加强了对oracle数据库的数据类型一些相关函数的学习  (一)char和varchar2  字符串函数 <1>concat(char1,char2)字符串连接函数,用于连接两个字 ...

  7. RecycleView在eclipse的初体验

    在sdk中找到v7包 \sdk\extras\android\support\v7\recyclerview 导入工程 Import\Android\Existing Android Code Int ...

  8. handlebars

    Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模版)的 ...

  9. Java并发(8):CountDownLatch、CyclicBarrier、Semaphore、Callable、Future

    CountDownLatch.CyclicBarrier.Semaphore.Callable.Future  都位于java.util.concurrent包下,其中CountDownLatch.C ...

  10. 斯坦福第七课:正则化(Regularization)

    7.1  过拟合的问题 7.2  代价函数 7.3  正则化线性回归 7.4  正则化的逻辑回归模型 7.1  过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...