statfs结构体和函数详解——例程
因为要读取SD卡的大小和使用情况,所以用到statfs这个函数,功能类似于df命令。
需要的头文件:#include <sys/vfs.h>
int statfs(const char *path, struct statfs *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; /* 文件名的最大长度 */
};
返回值:
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EACCES: (statfs())文件或路径名中包含的目录不可访问
EBADF : (fstatfs()) 文件描述词无效
EFAULT: 内存地址无效
EINTR : 操作由信号中断
EIO : 读写出错
ELOOP : (statfs())解释路径名过程中存在太多的符号连接
ENAMETOOLONG:(statfs()) 路径名太长
ENOENT:(statfs()) 文件不存在
ENOMEM: 核心内存不足
ENOSYS: 文件系统不支持调用
ENOTDIR:(statfs())路径名中当作目录的组件并非目录
EOVERFLOW:信息溢出
上代码例子:
#include <sys/vfs.h>
#include <stdio.h>int main()
{struct statfs diskInfo;//statfs("/media/card",&diskInfo);statfs("/dev",&diskInfo);unsigned long long blocksize = diskInfo.f_bsize;// 每个block里面包含的字节数unsigned long long totalsize = blocksize*diskInfo.f_blocks;//总的字节数char totalsize_GB[10]={0};printf("TOTAL_SIZE == %llu KB %llu MB %llu GB\n",totalsize>>10,totalsize>>20,totalsize>>30); // 分别换成KB,MB,GB为单位sprintf(totalsize_GB,"%.2f",(float)(totalsize>>20)/1024);printf("totalsize_GB=%s\n",totalsize_GB);unsigned long long freesize = blocksize*diskInfo.f_bfree; //再计算下剩余的空间大小printf("DISK_FREE == %llu KB %llu MB %llu GB\n",freesize>>10,freesize>>20,freesize>>30);unsigned long long usedsize = blocksize*(diskInfo.f_blocks - diskInfo.f_bfree);char usedsize_GB[10]={0};sprintf(usedsize_GB,"%.2f",(float)(usedsize>>20)/1024);printf("usedsize_GB=%s\n",usedsize_GB);return 0;
}
打印结果:
TOTAL_SIZE == 4079928 KB 3984 MB 3 GB
totalsize_GB=3.89
DISK_FREE == 4079924 KB 3984 MB 3 GB
usedsize_GB=0.00
df命令:
udev 4079928 4 4079924 1% /dev
可见结果是一致的。
代码里有几点有意思,换算成MB、GB是通过移位完成的。
但如果用GB为单位,需要保留两位小数呢?当 %.f2 格式即可,如果要传递这个数据,最好是用sprintf把小数格式成字符串更好吧。
已用的空间=总大小—剩余大小
statfs结构体和函数详解——例程相关推荐
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
- C++中的结构体vector排序详解
C++中的结构体vector排序详解 使用sort函数对一个vector很常用,前提是通文件中必须包含#include ,但是针对结构体vector排序则需要进行一定的改动.具体事例如下所示: // ...
- C语言结构体与指针ppt,c语言指针和结构体:链表详解.ppt
c语言指针和结构体:链表详解.ppt 1,第十一章 链表,2,例跳马.依下图将每一步跳马之后的位置x,y放到一个"结点"里,再用"链子穿起来",形成一条链,相邻 ...
- go结构体初始化_go嵌套匿名结构体的初始化详解
go匿名结构体 嵌套匿名结构体的 示例代码片. type debugConfig struct { MaxQueueDepth int `json:"maxQueueDepth"` ...
- Linux C Socket编程发送结构体、文件详解及实例
利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.c ...
- 32.【C/C++ 结构体全类型 (详解)】
C结构体的应用 (一).什么是结构体? (二).结构体的声明: 2.1介绍一下上面的结构体声明: 2.2struct声明的位置 2.3标记名的可省略性 (三).结构体变量的定义 3.1分配空间 3.2 ...
- 结构体和联合体详解-定义及初始化
文章目录 前言 一.结构体 1.1结构体类型 1.2定义结构体变量 1.3 初始化结构体变量 1.4结构体变量的引用 二.结构体数组 2.1定义结构体数组 2.2初始化结构体数组 三.联合体 3.1初 ...
- C/C++结构体字节对齐详解
结构体的sizeof 先看一个结构体: struct S1 { char c; int i; }; sizeof(S1)在VC6中按默认设置得到的结果为8. 我们先看看sizeof的定 ...
- c语言实现结构体变量private,C语言中结构体变量私有化详解
背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...
最新文章
- 阿里云 rds 在windows 里面恢复
- aix cpu java_AIX cpu理解
- 线程与消息循环的关系
- 基于MTD的NAND驱动开发(二)
- 利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑
- 枚举函数enumerate
- 95-150-015-源码-Sink-SinkFunction
- OSPF LSA详解
- 由WPS 2005想到的
- Chapter 3 Raster Images
- STM32自带GB2312字库显示汉字
- Java学习lesson 10
- 二维图画法入门_手绘的基础(入门)
- 基于BB方案,荣耀观影眼镜Vision Glass正式发布
- glutSwapBuffers()和glFlush()区别
- redis学习——redis事务
- SqlServer 对数据库文件进行增删改查
- htcvr设备计算机配置,【HTC-VIVE】02-设备的安装与配置(上)
- linux可以识别多少lun,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
- ISIS-ISIS高级特性—05
热门文章
- linux ppp用户管理,linux下ppp拨号上网
- 程序员们为什么不能“面朝大海,春暖花开?”
- go ip过滤_智慧识别“GOIP”呼转 罪犯无所遁形
- 定义一个抽象类一水果,创建若干水果对象存放在-一个水果类型的数组中,输出数组中所有水果的类型、重量
- 开学之际被Turkey问候,只能祭出正则大法
- 第三方登陆——QQ登陆详解
- 推荐一些免费的网盘给你
- Intel.VTune.Performance.Analyzer.v8.0.014.ISO下载
- python药店销售数据分析_Python数据分析实例一:医院药品销售数据
- 双天线和差测角matlab / FPGA开发