Disk space monitoring in Qt

Set the alarm threshold and monitor the disk, the code is as follows:
DiskSpaceMonitor.h

#ifndef MONITORDISKSPACETASK_H
#define MONITORDISKSPACETASK_H

#include <QThread>
#include <mutex>
#include <Windows.h>

#define GB (1024*1024*1024)
class DiskSpaceMonitor : public QThread
{
    
    
    Q_OBJECT
public:
    static DiskSpaceMonitor* getInstance()
    {
    
    
        if (m_pDiskSpaceMonitor == nullptr)
        {
    
    
            std::unique_lock<std::mutex> lck (m_mutex);
            if (m_pDiskSpaceMonitor == nullptr)
            {
    
    
                m_pDiskSpaceMonitor = new DiskSpaceMonitor;
            }
        }
        return m_pDiskSpaceMonitor;
    }
    void startThread();
    void stopThread();

private:
    explicit DiskSpaceMonitor(QObject *parent = 0);

protected:
    void run() override;


signals:
    void sig_DiskSpaceEnough(bool);
private:
    quint64     getDiskFreeSpace(QString iDriver);

signals:

private:
    static std::mutex m_mutex;
    static DiskSpaceMonitor* m_pDiskSpaceMonitor;
    bool m_bStart;
    int  m_freeSpace;
};

#endif // MONITORDISKSPACETASK_H

DiskSpaceMonitor.cpp

#include "DiskSpaceMonitor.h"
#include <Windows.h>
#include <QDir>
#include <QDebug>
#include <QSettings>
#include <QFileInfo>
#include <QFileInfoList>
#include <QCoreApplication>

std::mutex DiskSpaceMonitor::m_mutex;
DiskSpaceMonitor*  DiskSpaceMonitor::m_pDiskSpaceMonitor = nullptr;

DiskSpaceMonitor::DiskSpaceMonitor(QObject *parent) : QThread(parent),
    m_bStart(false)
{
    
    
    m_freeSpace = 50;//设定剩余空间阈值,单位G
}

void DiskSpaceMonitor::run()
{
    
    
    while(m_bStart)
    {
    
    
        QString path = "E:\Test";//设置被监控磁盘
        QFileInfo fileInfo(path);
        QString strDiskName = fileInfo.absolutePath();

        qint64 nFreeSpace = getDiskFreeSpace(strDiskName);

        bool bEnough = false;
        if( nFreeSpace > m_freeSpace )
        {
    
    
            bEnough = true;
        }
        else
        {
    
    
            bEnough = false;
        }

        emit sig_DiskSpaceEnough(bEnough);//发送信号待处理,false时空间低于阈值
        sleep(60);//每1分钟检测一次
    }
}

quint64 DiskSpaceMonitor::getDiskFreeSpace(QString iDriver)
{
    
    
    LPCWSTR strDriver = (LPCWSTR)iDriver.utf16();
    ULARGE_INTEGER freeDiskSpaceAvailable, totalDiskSpace, totalFreeDiskSpace;

    //调用函数获取磁盘参数(单位为字节Byte),转化为GB,需要除以(1024*1024*1024)
    GetDiskFreeSpaceExW( strDriver, &freeDiskSpaceAvailable, &totalDiskSpace, &totalFreeDiskSpace) ;

    qDebug() << "total space is:" << (quint64)totalDiskSpace.QuadPart/(1024*1024*1024);
    qDebug() << "free  space is:" << (quint64)totalFreeDiskSpace.QuadPart/(1024*1024*1024);

    return (quint64)totalFreeDiskSpace.QuadPart/GB;
}

void DiskSpaceMonitor::startThread()
{
    
    
    m_bStart = true;
    this->start();
}

void DiskSpaceMonitor::stopThread()
{
    
    
    m_bStart = false;
}

#include "testwgt.h"
#include <QApplication>
#include "DiskSpaceMonitor.h"

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
  
    DiskSpaceMonitor::getInstance()->startThread();

    return a.exec();
}

Guess you like

Origin blog.csdn.net/oTianLe1234/article/details/113849861