说明:这个小项目是关于文件操作的。主要的功能有:重复文件的查找(根据文件的大小),说白了,就是讲大小相同的文件在一起显示出来,供用户*的选择删除。这个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的知识还是可以借鉴学习的。