用statfs函数模拟df功能

本文详细解析了statfs结构中如何通过f_bfree和f_bavail字段来计算磁盘可用空间,并说明了在计算磁盘总大小、已用空间和可用空间时需要注意的事项。重点介绍了如何将块数转换为实际的GB或MB单位,并解释了为什么在计算百分比时使用进一法而非四舍五入法。

statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后

者为非root用户剩余空间,ext3文件系统给root用户分有5%的独享空间,所以这里是不

同的地方。这里要强调的是每块的大小一般是4K(×这句话错误,不一定都是4k,正确做法是:总大小= sfs.f_blocks×f_bsize,即块数×每块的大小,单位是bytes,也就是要/1024/1024/1024才是GB单位,另外要注意的问题是sfs.f_blocks×f_bsize数据过大溢出,可以sfs.f_blocks/1024×f_bsize/1024=MB单位。因此,要实现与df结果一致的就得在

获得块数上乘以4,这样已用、可用、总块数就可以实现。如果还要实现百分比一致,

那么要注意的是,df命令获得是整数百分比,没有小数,这里使用的进一法,而不是四

舍五入法。所以在程序里直接+1取整。

disk_size = sfs.f_blocks/1024*sfs.f_bsize/1024;//MB总大小

avilable =sfs.f_bavail/1024*sfs.f_bsize/1024;//MB可以空间大小

double all=sfs.f_blocks - sfs.f_bfree + sfs.f_bavail;

if(0!=all)

percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / all + 1;可用百分比

类B:package com.isa.navi.manager; import android.os.RemoteCallbackList; import androidx.annotation.NonNull; import com.isa.navi.jni.hmi.HmiJNIImpl; import com.isa.navi.jni.hmi.update.USBListener; import com.isa.carplay.library.carplay.ILocationCallback; import com.isa.carplay.library.carplay.bean.LocationInfo; import com.isa.navi.library.map.IMapDownloadCallbackAIDL; import com.isa.navi.library.map.UpdateInfoBean; import com.isa.navi.utils.BinderUtils; import com.isa.navi.utils.LogUtils; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import df.car.hardware.CarPropertyValue; public class CallBackManager { private final String TAG = "CallBackManager"; private RemoteCallbackList<IMapDownloadCallbackAIDL> mIHardwareRemoteCallbackList = new RemoteCallbackList<>(); private RemoteCallbackList<ILocationCallback> mILocationCallbackList = new RemoteCallbackList<>(); private List<CarManager.IInitFinishListener> mCarServiceIInitFinishListener = new CopyOnWriteArrayList<>(); private List<CarManager.IEventChangeListener> mCarEventChangeListener = new CopyOnWriteArrayList<>(); private List<LocationMgr.IGnssEventChangeListener> mGnssEventChangeListener = new CopyOnWriteArrayList<>(); private List<LocationMgr.ISatelliteEventChangeListener> mSatelliteEventChangeListener = new CopyOnWriteArrayList<>(); private List<USBListener> usbEventChangeListener = new CopyOnWriteArrayList<>(); private CallBackManager() { LogUtils.i(TAG, "CallBackManager construction is called."); } private static class CallBackManagerHolder { private static CallBackManager sCallBackManager = new CallBackManager(); } public static CallBackManager getInstance() { return CallBackManagerHolder.sCallBackManager; } public void registerUpdateStatusListener(IMapDownloadCallbackAIDL callback) { if (!BinderUtils.LOG_CB_BINDER_INFO("registerUpdateStatusListener", callback, BinderUtils.ACTION_REGISTER)) { return; } mIHardwareRemoteCallbackList.register(callback); if ( HmiJNIImpl.getInstance().dataVersionCheckAvaliable) { HmiJNIImpl.getInstance().dataVersionCheck();//调用时间点-zwx } } 类A:相关代码:package com.isa.navi.jni.hmi; import android.content.Context; import android.os.Message; import android.os.StatFs; import android.util.Log; import androidx.annotation.NonNull; import com.isa.navi.jni.hmi.bean.UpdateList; import com.isa.navi.jni.hmi.update.USBListener; import com.isa.navi.library.map.UpdateEnvironment; import com.isa.navi.library.map.UpdateInfoBean; import com.isa.navi.manager.CallBackManager; import com.isa.navi.manager.CarManager; import com.isa.navi.manager.base.BaseHandlerManager; import com.isa.navi.receiver.USBReceiver; import com.isa.navi.utils.GsonUtils; import com.isa.navi.utils.LogUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.time.LocalDate; import java.time.Month; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; public class HmiJNIImpl extends BaseHandlerManager implements IHmiJNI { private static final String TAG = "UPDATE"; private static final int MSG_DOWNLOAD_STATUS_CHANGE = 1; private final HmiProxyJNI mHmiProxyJNI; private final Format mFormat; private static final String PASSWORD_PREFIX = "DfCs"; private static final String PASSWORD_SUFFIX = "#@"; private static final int LAST_CHARS_LENGTH = 4; private static String updateUSBpath = ""; public boolean dataVersionCheckAvaliable; //注册一个接口 public interface HmiInitializeLicense { void Initialize(); } // license.Initialize();触发后此函数体内部执行对应方法 public HmiInitializeLicense license = new HmiInitializeLicense() { @Override public void Initialize() { int flag = 1; } }; /** * 车辆管理实例,用于管理车辆相关的功能。 */ private CarManager mCarManager; private volatile static HmiJNIImpl mInstance; private boolean is_run = false; private final Set<String> USBPathSet = Collections.synchronizedSet(new HashSet<>()); public static HmiJNIImpl getInstance() { if (mInstance == null) { synchronized (HmiJNIImpl.class) { if (mInstance == null) { mInstance = new HmiJNIImpl(); } } } return mInstance; } private HmiJNIImpl() { super(true); mHmiProxyJNI = new HmiProxyJNI(); mFormat = Format.getInstance(); mCarManager = CarManager.getInstance(); } @Override public void initialize() { super.initialize(); LogUtils.d(TAG, "initialize : "); DfCert.getInstance().getService(); CallBackManager.getInstance().registerUSBEventChangeListener(new USBListener() { @Override public void path(String mountPath) { USBPathSet.add(mountPath); LogUtils.i(TAG,"USBPathSet:" + mountPath); } }); // 初始化C++模块 mHmiProxyJNI.InitializeCpp(); license.Initialize(); InstanceEngine(); } 补充标志位的定义,赋值,重置
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值