在linux系统中为获取磁盘的剩余空间大小或者其他的一些硬盘信息,可以通过以下两种方式获取:直接在终端通过指令获取或者通过linux c编程获取硬盘的信息结构体。
打开终端,在终端输入:
df /home -h
硬盘的statfs信息结构如下:
一般我们想要了解的就是硬盘的剩余大小,statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后者为非root用户剩余空间。
建立获取及输出硬盘信息的类,头文件.h:
#ifndef STATFSINFO_H
#define STATFSINFO_H
#include
#include
#include
#include
#include
#include
typedef struct statfs DISK,*pDISK;
class StatfsInfo
{
public:
StatfsInfo();
virtual ~StatfsInfo();
int getDiskInfo(const char *path);
int calDiskInfo(char *diskTotal,char *diskAvail,char *diskFree);
private:
DISK diskInfo;
pDISK pDiskInfo;
};
#endif // STATFSINFO_H
类的实现,.cpp文件:
#include "StatfsInfo.h"
StatfsInfo::StatfsInfo()
{
pDiskInfo = &diskInfo;
memset(pDiskInfo,0,sizeof(DISK));//ctor
}
StatfsInfo::~StatfsInfo()
{
//dtor
}
//参数:要获取磁盘信息的位置 //返回值:成功返回1,失败返回0
int StatfsInfo::getDiskInfo(const char *path)
{
char dpath[100]=DEFAULT_DISK_PATH;//设置默认位置
int flag=0;
if(NULL!=path)
{
strcpy(dpath,path);
}
if(-1==(flag=statfs(dpath,pDiskInfo)))//获取包含磁盘空间信息的结构体
{
perror("getDiskInfo statfs fail");
return 0;
}
return 1;
}
//计算磁盘总空间,非超级用户可用空间,磁盘所有剩余空间,计算结果以字符串的形式存储到三个字符串里面,单位为MB
int StatfsInfo::calDiskInfo(char *diskTotal,char *diskAvail,char *diskFree)
{
unsigned long long total=0,avail=0,free=0,blockSize=0;
int flag=0;
if(!diskTotal&&diskAvail&&diskFree&&pDiskInfo)
{
printf("\ncalDiskInfo param null!\n");
return 0;
}
blockSize=pDiskInfo->f_bsize;//每块包含字节大小
total=pDiskInfo->f_blocks*blockSize;//磁盘总空间
avail=pDiskInfo->f_bavail*blockSize;//非超级用户可用空间
free=pDiskInfo->f_bfree*blockSize;//磁盘所有剩余空间
//字符串转换
flag=sprintf(diskTotal,"%llu",total>>20);
flag=sprintf(diskAvail,"%llu",avail>>20);
flag=sprintf(diskFree,"%llu",free>>20);
if(-1==flag)
{
return 0;
}
return 1;
}
在主函数里调用:
int main()
{
StatfsInfo currStatfsInfo;
char str1[30],str2[30],str3[30];
currStatfsInfo.getDiskInfo(DEFAULT_DISK_PATH);//获取磁盘信息结构体
currStatfsInfo.calDiskInfo(str1,str2,str3);//计算磁盘信息结构体
printf("\ntotal:%s avail:%s free%s\n",str1,str2,str3);
return 0;
}