Android中statfs使用注意事项
16lz
2021-01-25
1. 问题描述
在Android中初次使用statfs计算出的可用空间总是不对,经仔细析,发现是数据类型的问题。
2. 关键数据结构
定义见sys/vfs.h
/* note: this corresponds to the kernel's statfs64 type */struct statfs { uint32_t f_type; uint32_t f_bsize; uint64_t f_blocks; uint64_t f_bfree; uint64_t f_bavail; uint64_t f_files; uint64_t f_ffree; __kernel_fsid_t f_fsid; uint32_t f_namelen; uint32_t f_frsize; uint32_t f_spare[5];};
3. 常用数据类型长度
测试结果如下:
sizeof(size_t)=4,sizeof(uint32_t)=4,sizeof(uint64_t)=8
size_t 定义为:
typedef unsigned int size_t; //sys/types.h中定义
4. 实现代码
uint32_t getFreeSizeMB(const char * path){ //如path为:/system struct statfs st; uint64_t sizeBytes; uint32_t availMb; if (statfs(path, &st) < 0) { SLOGE("***TRACE:%s(%d):statfs error: %s: %s\n",__FUNCTION__,__LINE__, path, strerror(errno)); return -1; } else { sizeBytes = st.f_bavail * (uint64_t)st.f_bsize; //关键 availMb = (uint32_t)(sizeBytes >> 20); //SLOGD("***TRACE:f_blocks=%lld,f_bfree=%lld,f_bsize=%ld,f_bavail=%lld",st.f_blocks,st.f_bfree,st.f_bsize,st.f_bavail); //SLOGD("***TRACE:%s(%d):path=%s:availMB=%ld",__FUNCTION__,__LINE__,path,availMb); //sizeBytes = st.f_bfree * (uint64_t)st.f_bsize; //availMb = (uint32_t)(sizeBytes >> 20); //SLOGD("***TRACE:%s(%d):path=%s:freeMB=%ld",__FUNCTION__,__LINE__,path,availMb); return availMb; }}
更多相关文章
- Android(安卓)中使用自定义字体的方法
- Android(安卓)Sensor HAL层分析
- Android(安卓)自定义手写签名并保存到sdcard中(可以保存背景图)
- android 自定义 view 实现表盘效果
- android带返回按钮的自定义标题栏
- Android(安卓)Market 链接的生成与分享
- Android(安卓)自定义Viewpager滑动速度
- 【Android】Activity之间传递信息
- android之Layout(二)