statfs java_statfs获得硬盘使用情况

先说statfs结构:

#include /* 或者 */

int statfs(const char *path, struct statfs *buf);

int fstatfs(int fd, struct statfs *buf);

参数:

path: 位于需要查询信息的文件系统的文件路径名。

fd: 位于需要查询信息的文件系统的文件描述词。

buf:以下结构体的指针变量,用于储存文件系统相关的信息

struct statfs {

long    f_type;     /* 文件系统类型  */

long    f_bsize;    /* 经过优化的传输块大小  */

long    f_blocks;   /* 文件系统数据块总数 */

long    f_bfree;    /* 可用块数 */

long    f_bavail;   /* 非超级用户可获取的块数 */

long    f_files;    /* 文件结点总数 */

long    f_ffree;    /* 可用文件结点数 */

fsid_t  f_fsid;     /* 文件系统标识 */

long    f_namelen;  /* 文件名的最大长度 */

};

statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后者为非root用户剩余空间,ext3文件系统给root用户分有5%的独享空间,所以这里是不同的地方。这里要强调的是每块的大小一般是4K。因此,要实现与df结果一致的就得在获得块数上乘以4,这样已用、可用、总块数就可以实现。如果还要实现百分比一致,那么要注意的是,df命令获得是整数百分比,没有小数,这里使用的进一法,而不是四舍五入法。所以在程序里直接+1取整。

下面是实现的一个例子:(home目录为一个独立分区)#include #include int main()

{

struct statfs sfs;

int i = statfs("/home", &sfs);

int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks - sfs.f_bfree + sfs.f_bavail)+ 1;

printf("/dev/sda11            %ld    %ld  %ld   %d%% /home\n",

4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree),      4*sfs.f_bavail, percent);

system("df /home ");

return 0;

}

执行结果:

leave@LEAVE:~/test$ gcc -o df df.c

leave@LEAVE:~/test$ ./df

/dev/sda11            42773008    540356  40059864   2% /home

文件系统           1K-块        已用     可用 已用% 挂载点

/dev/sda11            42773008    540356  40059864   2% /home

leave@LEAVE:~/test$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值