Android中statfs使用注意事项

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






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值