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操 ...
随机推荐
- ubuntu 14 配置JDK
1. 下载JDK http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html 下载后的保存地址: /home/root1 ...
- java文件乱码
要让一个 Java 源文件打开时编码格式为 UTF-8,需要做2件事情:1)设置Java 源文件的默认编码格式为UTF-8:2)设置workspace的编码格式为UTF-8. 相应设置如下: 设置 J ...
- myeclipse中Web App Libraries无法自动识别lib下的jar包
在项目目录下找到.object文件修改 <natures> <nature>org.eclipse.jem.workbench.JavaEMFNature</nature ...
- C#使用NPOI导出Excel表格
using NPOI.HSSF.UserModel;using NPOI.SS.UserModel; /// <summary> /// DataTable导出Excel /// < ...
- adb通信原理分析
关于这个问题,自己研究了一下,没有研究出来 在网络上搜罗了一下,基本上关于ADB的原理用了两张图表示: 我表示没有看懂这两个图, 又开始查阅一些一些资料: 首先知道adb的通信有Sock ...
- 搭建angular前端框架 命令
首先必备的工具都下下好. 然后现在开始输入命令行创建angular 项目 1.node cd .. 2.yo bower grunt 3.npm install -g generator-angula ...
- Nginx-->进阶-->原理-->Nginx+php+fastcgi的原理与关系
一.用户对动态PHP网页访问过程 用户浏览器发起对网页的访问:http://192.168.1.103/index.php 用户和nginx服务器进行三次握手进行TCP连接(忽略包括nginx访问控制 ...
- 用T-sql 实现Oracle Connect by 的功能
; with subDepartment as ( select BesonDepartmentID, DepartmentName, ParentBesonDepartmentID, 1 as Hi ...
- 简易版CMS后台管理系统开发流程
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- $watch监听数据变化和run方法
angular中$watch方法可以监听数据的变化. $scope.$watch('phone',function(){ $scope.phone.fre = $scope.phone.num> ...