首页 > 代码库 > Qt之课外实践——文件操作(简单清道夫)
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_OBJECTpublic: 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的知识还是可以借鉴学习的。
Qt之课外实践——文件操作(简单清道夫)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。