获取磁盘内存与可用内存

该代码实现了一个C++类CDiskCapacityManage,用于在Qt环境中进行磁盘容量监控。它使用QThread进行异步处理,每两分钟检查一次磁盘空间,并在空间不足时显示警告对话框,提供清理选项。程序还包含了清理过期文件的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
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

在网站找了一个小程序,发现运行不了,希望大佬们帮忙指正下。

声明:下述方法整理自网络,帮助文档以及学习总结,仅供参考交流,希望对您有用;如有错误,敬请指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值