您的位置:首页 > 移动开发 > Android开发

Android中statfs使用注意事项

2016-11-16 00:00 369 查看

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: