cdiskcapacitymanage.h
#ifndef CDISKCAPACITYMANAGE_H
#define CDISKCAPACITYMANAGE_H
#include <QTimer>
#include <QThread>
#include <QPointer>
#include <QDialog>
class CDiskCapacityManage : public QThread
{
Q_OBJECT
public:
CDiskCapacityManage(QWidget *parent = 0);
~CDiskCapacityManage();
static CDiskCapacityManage *instance();
static CDiskCapacityManage *s_obj;
//static QPointer<CDiskCapacityManage> diskThread;
bool isOpenDiskMonitor; //!< 是否开启磁盘监控
QString pathDisk; //!<
public slots:
void slotDistStatus();
void showMessage();
signals:
void btnOkClicked();
private:
void getDiskSpace(QString strDisk, double &dTotalBytes, double &dFreeBytes);
void run();
void deleteOverdueFolder(QString folderPath);
QTimer *monitorTimer;
bool isTimerEnd = false;
bool isAppQuit = false;
};
#endif // CDISKCAPACITYMANAGE_H
cdiskcapacitymanage.cpp
#include "cdiskcapacitymanage.h"
#include <QThread>
#include <QCoreApplication>
#include <QMessageBox>
#include <QWidget>
#include <QDebug>
#include <QPushButton>
#include <QDir>
#include <QFile>
#include <QDateTime>
#include <QApplication>
#include <windows.h>
CDiskCapacityManage *CDiskCapacityManage::s_obj = nullptr;
CDiskCapacityManage::CDiskCapacityManage(QWidget *parent)
: QThread(parent)
{
qDebug()<< u8"磁盘监控线程构造函数所在线程ID号为:"<<QThread::currentThreadId();
connect(this, &CDiskCapacityManage::btnOkClicked,this,&CDiskCapacityManage::showMessage,Qt::DirectConnection);
connect(qApp,&QApplication::aboutToQuit,[ = ](){
isAppQuit = true;
});
monitorTimer = new QTimer;
connect(monitorTimer, &QTimer::timeout, this, &CDiskCapacityManage::slotDistStatus, Qt::DirectConnection);
monitorTimer->start(60000); //!< 2分钟计算一下磁盘容量
qDebug()<< u8"磁盘监控定时器已经启动!";
}
CDiskCapacityManage::~CDiskCapacityManage()
{
if (monitorTimer != nullptr)
delete monitorTimer;
}
CDiskCapacityManage *CDiskCapacityManage::instance()
{
if (s_obj == nullptr) {
s_obj = new CDiskCapacityManage();
}
return s_obj;
}
void CDiskCapacityManage::showMessage()
{
qDebug()<< u8"单击确定按钮,开子线程操作所在的线程ID号为:"<<QThread::currentThreadId();
s_obj->start();
}
void CDiskCapacityManage::slotDistStatus()
{
if (!isOpenDiskMonitor)
return;
QString strDisk ="c:/"; //!< 默认监控C盘
double dTotalBytes,dFreeBytes;
getDiskSpace(strDisk,dTotalBytes,dFreeBytes);
qInfo()<< u8"开始扫描计算硬盘容量!";
QString mesg = u8"磁盘剩余空间:" + QString::number(dFreeBytes) +
u8"GB\n磁盘总空间:"+ QString::number(dTotalBytes) +"GB\n"+
u8"(提示:单击清理将会自动清理7天之前的数据,单击取消将暂时忽略!)\n";
if (dFreeBytes <= 10 ){
QMessageBox *msgBox = new QMessageBox(QMessageBox::Warning,u8"警告:" ,mesg,QMessageBox::NoButton);
QPushButton *btnOk = msgBox->addButton(u8"清 理",QMessageBox::YesRole);
QObject::connect(btnOk, &QPushButton::clicked,[ = ](){
emit CDiskCapacityManage::btnOkClicked();
qDebug()<< u8"提示框响应函数所在线程ID号为:"<< QThread::currentThreadId();
});
QPushButton *btnCancel = msgBox->addButton(u8"取 消",QMessageBox::NoRole);
QObject::connect(btnCancel, &QPushButton::clicked,[ = ]() {
qDebug() << u8"暂时忽略该警告!";
});
msgBox->exec();
delete msgBox;
}
}
void CDiskCapacityManage::getDiskSpace(QString strDisk, double &dTotalBytes, double &dFreeBytes)
{
LPCWSTR lpcwstrDriver = (LPCWSTR)strDisk.utf16();
ULARGE_INTEGER lFreeBytesAvailable,lTotalBytesTemp,lTotalFreeBytes;
if (!GetDiskFreeSpaceEx(lpcwstrDriver, &lFreeBytesAvailable, &lTotalBytesTemp, &lTotalFreeBytes))
{
dTotalBytes = -1;
dFreeBytes = -1;
return;
}
dTotalBytes = lTotalBytesTemp.QuadPart / 1024.0 / 1024 / 1024;
dFreeBytes = lTotalFreeBytes.QuadPart / 1024.0 / 1024 / 1024;
}
void CDiskCapacityManage::run()
{
qDebug()<< u8"进入子线程,且ID号为:"<< QThread::currentThreadId();
QString path = pathDisk;
deleteOverdueFolder(path); //!< 送归调用并删除文件
qInfo()<< u8"文件清理完成!";
}
void CDiskCapacityManage::deleteOverdueFolder(QString folderPath)
{
if (folderPath.isEmpty())
{
qCritical() << u8"文件路径为空!";
return;
}
QDir dir(folderPath);
if (!dir.exists())
{
qCritical() << u8"文件夹不存在!";
return;
}
QFileInfoList file_list = dir.entryInfoList(QDir::Files|QDir::Hidden|QDir::NoSymLinks);
QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot);
for (int i = 0;i != folder_list.size();i++)
{
if (isAppQuit)
this->terminate();
QString name = folder_list.at(i).absoluteFilePath();
QDir dirChild(name);
qDebug() << u8"遍历的文件夹名:"<< name;
deleteOverdueFolder(name); //!< 递归删除
QFileInfoList child_file_list= dirChild.entryInfoList(QDir::Files|QDir::Hidden|QDir::NoSymLinks);
file_list.append(child_file_list);
}
for (QFileInfo fileChild:file_list)
{
if (isAppQuit)
this->terminate();
QDateTime fileCreateTime = fileChild.created();
QDateTime fileModifyTime = fileChild.lastModified();
int timeInterval = QDateTime::currentDateTime().toTime_t()-fileModifyTime.toTime_t();
qDebug()<< u8"遍历所有:文件名 创建时间 最后修改时间 时间间隔"
<< fileChild.absoluteFilePath()
<< fileCreateTime.toString("yyyy-MM-dd-hh-mm-ss-zzz")
<< fileModifyTime.toString("yyyy-MM-dd-hh-mm-ss-zzz")
<< QString::number(timeInterval) + "s";
if (timeInterval>691200)
{ //! 时间间大于8天 691200; 36000为10个小时
fileChild.dir().remove(fileChild.fileName());//!< 删除文件
fileChild.dir().rmpath(fileChild.dir().absolutePath()); //!< 删除当前文件所在的目录
qDebug() << u8"存在旧文件并删除!";
}
}
}
main.cpp
#include "cdiskcapacitymanage.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CDiskCapacityManage w;
w.showMessage();
return a.exec();
}
CDiskCapacityManage.pro
#-------------------------------------------------
#
# Project created by QtCreator 2023-05-04T10:10:36
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = CDiskCapacityManage
TEMPLATE = app
SOURCES += main.cpp\
cdiskcapacitymanage.cpp
HEADERS += cdiskcapacitymanage.h
QMAKE_CXXFLAGS_RELEASE += -g
QMAKE_CFLAGS_RELEASE += -g
QMAKE_LFLAGS_RELEASE = -mthreads -Wl
在网站找了一个小程序,发现运行不了,希望大佬们帮忙指正下。
声明:下述方法整理自网络,帮助文档以及学习总结,仅供参考交流,希望对您有用;如有错误,敬请指正!