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操 ...
随机推荐
- JQuery Mobile 页面参数传递(转)
在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- [转] swf文件加密基础
本来打算下班回来就写这个东西,一方面算是对今天学习的一个笔记记录,另外一方面,给一些朋友普及一些swf文件加密基础知识.之所以说是基础,那是因为我也是刚学习了一点,灰常的基础.不过晚上看了一会我是传奇 ...
- JVM调优-Java垃圾回收之分代回收
为什么要进行分代回收? JVM使用分代回收测试,是因为:不同的对象,生命周期是不一样的.因此不同生命周期的对象采用不同的收集方式. 可以提高垃圾回收的效率. Java程序运行过程中,会产生大量的对象, ...
- 第七章 springboot + retrofit
retrofit:一套RESTful架构的Android(Java)客户端实现. 好处: 基于注解 提供JSON to POJO,POJO to JSON,网络请求(POST,GET,PUT,DELE ...
- Verilog之电平检测
检测低电平为例 module detect_module ( CLK, RSTn, RX_Pin_In, H2L_Sig ); input CLK; input RSTn; input RX_Pin_ ...
- Sublime Text 3常用快捷键 以及package control 安装
网络上搜索到的,现整理下来备用: package control安装 view下 ctrl+~ import urllib.request,os; pf = 'Package Control.subl ...
- 下载python标准库--python
#coding:utf-8 import urllib2 import os,sys from BeautifulSoup import BeautifulSoup # For processing ...
- android4.3 Bluetooth(le)分析之startLeScan分析
BluetoothAdapter.java中有low enery(le)的一些方法,android提供了这些方法,但源码中并未找到这些方法的调用之处.本文档主要分析这类方法的执行流程,来了解下le到底 ...
- imageNamed、imageWithContentsOfFile、imageWithData
[UIImage imageNamed:ImageName]; 1.加载图片占据的内存较大 2.相同的图片只会加载一份到内存中,如果同时使用,使用同一个对象即可 3.当对象销毁,图片对象不会随着一起销 ...