首页 > 技术文章 > linux下获取硬盘、内存、U盘大小及使用大小

wanzaiyimeng 2016-12-09 14:27 原文

/*
 * 获取硬盘大小;内存大小;usb大小
 */

#ifndef SYSINFOGET_H
#define SYSINFOGET_H

#include <stdio.h>
//磁盘信息
#include <sys/statfs.h>
#include <sys/vfs.h>
#include <errno.h>

//内存信息
#include <sys/sysinfo.h>

#include <unistd.h>
#include <sys/time.h>
//系统账号信息
#include <pwd.h>
//文件信息
#include <dirent.h>
#include <sys/stat.h>

#include <QDebug>

class SysInfoGet
{
public:
    SysInfoGet();

    /**
     * @brief getSysInfoInit    初始化数据
     */
    void getSysInfoInit();
    /**
     * @brief getSysInfo        获取数据
     */
    void getSysInfo();

    double MBsize;                 //计算MB用

    char *path;
    char *pathUsb;

    struct statfs diskInfo;     //系统分区磁盘大小
    struct sysinfo memInfo;     //内存信息
    struct statfs diskInfo2;    //usb分区磁盘大小
    struct dirent *ent;

public:
    /**
     * @brief totalDiskSize     磁盘大小
     */
    double totalDiskSize;
    /**
     * @brief usedDiskSize      已用磁盘大小
     */
    double usedDiskSize;

    /**
     * @brief totalMemSize      内存大小
     */
    double totalMemSize;
    /**
     * @brief usedMemSize       已用内存
     */
    double usedMemSize;

    /**
     * @brief totalUsbSize      usb大小
     */
    double totalUsbSize;
    /**
     * @brief usedUsbSize       usb已用大小
     */
    double usedUsbSize;
    /**
     * @brief usbExist          usb是否存在
     */
    bool usbExist;

};

#endif // SYSINFOGET_H


#include "sysinfoget.h"

SysInfoGet::SysInfoGet()
{
    getSysInfoInit();           //初始化
    //getSysInfo();               //获取
}

void SysInfoGet::getSysInfoInit(){
    //初始化usb加载地址
    struct passwd *pwd = new passwd;
    pwd = getpwuid(getuid());

    path = new char(15);
    strcpy(path, "/media/");
    strcat(path, pwd->pw_name); // ./media/root

    //初始化
    pathUsb = new char(25);     //长度够不够?

    ent = new dirent;

    //数据
    MBsize = 1024.0*1024.0;     //最终结果只留下两位
    totalDiskSize=0;
    usedDiskSize=0;
    totalMemSize=0;
    usedMemSize=0;
    totalUsbSize=0;
    usedUsbSize=0;
    usbExist=false;
}

void SysInfoGet::getSysInfo()
{
    //--------磁盘信息测试---------------------------
    //struct statfs diskInfo;
    statfs("/", &diskInfo);

    totalDiskSize = (double)(diskInfo.f_bsize*diskInfo.f_blocks)/MBsize;
    usedDiskSize = (double)(diskInfo.f_bsize*diskInfo.f_blocks-diskInfo.f_bsize*diskInfo.f_bfree)/MBsize;

    //qDebug()<<"total:"<<totalDiskSize<<"MB";
    //qDebug()<<"used :"<<usedDiskSize<<"MB";

    //---------内存信息测试----------------------------
    //struct sysinfo memInfo;
    sysinfo(&memInfo);

    totalMemSize = (double)memInfo.totalram/MBsize;
    usedMemSize = (double)(memInfo.totalram-memInfo.freeram)/MBsize;

    //qDebug()<<"totalRAM:"<<totalMemSize<<"MB";
    //qDebug()<<"used RAM:"<<usedMemSize<<"MB";

    //---------U盘信息测试------------------------------
    DIR *pDir = opendir(path);

//    int existFlag;
//    existFlag = 0;
//    while(NULL != (ent=readdir(pDir)) )
//    {
//        if(ent->d_type==4)//if(ent->d_type & DT_DIR)
//        {
//            if(strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0) continue;

//            //qDebug()<<ent->d_name;//u盘文件夹名称
//            strcpy(pathUsb, path);
//            strcat(pathUsb, "/");
//            strcat(pathUsb, ent->d_name);
//            //qDebug()<<pathUsb;//u盘文件夹地址

//            struct statfs diskInfo2;
//            statfs(pathUsb, &diskInfo2);
//            totalUsbSize = (double)(diskInfo2.f_bsize*diskInfo2.f_blocks)/MBsize;
//            usedUsbSize = (double)(diskInfo2.f_bsize*diskInfo2.f_blocks-diskInfo2.f_bsize*diskInfo2.f_bfree)/MBsize;
//            existFlag=1;

//            //qDebug()<<"totalUSB :"<<totalUsbSize<<"MB";
//            //qDebug()<<"used USB :"<<usedUsbSize<<"MB";
//        }
//    }
//    closedir(pDir);//必须关闭
//    if(existFlag == 1){
//        usbExist = true;
//    }
//    else{
//        usbExist = false;
//    }

    //此获取的是最新插入的那个usb(一个)
    ent=readdir(pDir);                  //UUI1;UUI;..;.
    //qDebug()<<"test "<<ent->d_name;
    if(ent->d_type==4){                 //属于文件夹
        if(strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0)
        {
            usbExist = false;
            totalUsbSize = 0;
            usedUsbSize = 0;
        }
        else
        {
            strcpy(pathUsb, path);
            strcat(pathUsb, "/");
            strcat(pathUsb, ent->d_name);   //获取u盘地址

            //struct statfs diskInfo2;
            statfs(pathUsb, &diskInfo2);

            usbExist = true;
            totalUsbSize = (double)(diskInfo2.f_bsize*diskInfo2.f_blocks)/MBsize;
            usedUsbSize = (double)(diskInfo2.f_bsize*diskInfo2.f_blocks-diskInfo2.f_bsize*diskInfo2.f_bfree)/MBsize;
            //qDebug()<<"totalUSB :"<<totalUsbSize<<"MB";
            //qDebug()<<"used USB :"<<usedUsbSize<<"MB";
        }
    }
    closedir(pDir);                     //必须关闭

    //qDebug()<<"USB :"<<usbExist;
}

 

推荐阅读