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;    }}






更多相关文章

  1. Android(安卓)中使用自定义字体的方法
  2. Android(安卓)Sensor HAL层分析
  3. Android(安卓)自定义手写签名并保存到sdcard中(可以保存背景图)
  4. android 自定义 view 实现表盘效果
  5. android带返回按钮的自定义标题栏
  6. Android(安卓)Market 链接的生成与分享
  7. Android(安卓)自定义Viewpager滑动速度
  8. 【Android】Activity之间传递信息
  9. android之Layout(二)

随机推荐

  1. 转:Android电话系统之-rild
  2. android中Parcelable接口的使用
  3. Android中为APP创建快捷方式的原理(自己的
  4. AndroidHttpClient使用Cookie应用分析
  5. android的selector背景选择器
  6. Android(安卓)路由框架ARouter详细使用教
  7. Android中的Activity生命周期
  8. Android之BaseAdapter适配器使用技巧
  9. Android 自动改 Hosts工具 v1.0.1 更
  10. Android——RecyclerView入门学习之Recyc