跳到主要内容

应用及文件系统空间统计

在系统中,可能出现系统空间不够或者cacheDir等目录受系统配额限制等情况,需要应用开发者关注系统剩余空间,同时控制应用自身占用的空间大小。

接口说明

API的详细介绍请参见ohos.file.statvfsohos.file.storageStatistics

表1 文件系统空间和应用空间统计

模块接口名功能
@ohos.file.storageStatisticsgetCurrentBundleStats获取当前应用的存储空间大小(单位为Byte)。
@ohos.file.storageStatisticsgetFreeSize异步获取内置存储的可用空间大小(单位为Byte)。 说明:从API version 15开始,支持该接口。
@ohos.file.storageStatisticsgetFreeSizeSync同步获取内置存储的可用空间大小(单位为Byte)。 说明:从API version 15开始,支持该接口。
@ohos.file.storageStatisticsgetTotalSize异步获取内置存储的总空间大小(单位为Byte)。 说明:从API version 15开始,支持该接口。
@ohos.file.storageStatisticsgetTotalSizeSync同步获取内置存储的总空间大小(单位为Byte)。 说明:从API version 15开始,支持该接口。
@ohos.file.statvfsgetFreeSize获取指定文件系统的剩余空间大小(单位为Byte)。 说明:从API version 20开始,支持该接口。
@ohos.file.statvfsgetTotalSize获取指定文件系统的总空间大小(单位为Byte)。 说明:从API version 20开始,支持该接口。

表2 应用空间统计

表格中统计路径列涉及的目录均指应用的沙箱路径,查看路径前需要先进入对应的应用沙箱空间。进入沙箱空间需要执行以下命令:

  1. hdc shell。
  2. nsenter -t {pid} -m sh。
BundleStats属性含义统计路径
appSize应用安装文件大小(单位为Byte)应用安装文件保存在以下目录: /data/storage/el1/bundle
cacheSize应用缓存文件大小(单位为Byte)应用的缓存文件保存在以下目录: /data/storage/${el1-el5}/base/cache /data/storage/${el1-el5}/base/haps/${moduleName}/cache 说明:${el1-el5}指的是el1,el2,el3,el4,el5目录。${moduleName}是模块名。
dataSize应用文件存储大小(除应用安装文件)(单位为Byte)应用文件通常由本地文件、分布式文件、数据库文件等部分组成。 本地文件保存在以下目录(注意缓存文件目录为以下目录的子目录): /data/storage/${el1-el5}/base 分布式文件保存在以下目录: /data/storage/el2/distributedfiles 数据库文件保存在以下目录: /data/storage/${el1-el5}/database 说明:${el1-el5}指的是el1,el2,el3,el4,el5目录

开发示例

  • 获取文件系统数据分区剩余空间大小。

    import { statfs } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import { common } from '@kit.AbilityKit';
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    let path = context.filesDir;
    statfs.getFreeSize(path, (err: BusinessError, number: number) => {
    if (err) {
    console.error(`Invoke getFreeSize failed, code is ${err.code}, message is ${err.message}`);
    } else {
    console.info(`Invoke getFreeSize succeeded, size is ${number}`);
    }
    });
  • 获取当前应用的存储空间大小。

    import { storageStatistics } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    storageStatistics.getCurrentBundleStats((err: BusinessError, bundleStats: storageStatistics.BundleStats) => {
    if (err) {
    console.error(`Invoke getCurrentBundleStats failed, code is ${err.code}, message is ${err.message}`);
    } else {
    console.info(`Invoke getCurrentBundleStats succeeded, appsize is ${bundleStats.appSize}`);
    }
    });
  • 异步获取内置存储的总空间大小。

    import { storageStatistics } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    storageStatistics.getTotalSize().then((number: number) => {
    console.info(`getTotalSize successfully, number is ${number}`);
    }).catch((err: BusinessError) => {
    console.error(`getTotalSize failed with error, code is ${err.code}, message is ${err.message}`);
    });
  • 同步获取内置存储的总空间大小。

    import { storageStatistics } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    try {
    let number = storageStatistics.getTotalSizeSync();
    console.info(`getTotalSizeSync successfully, number is ${number}`);
    } catch (err) {
    let error: BusinessError = err as BusinessError;
    console.error(`getTotalSizeSync failed with error, code is ${error.code}, message is ${error.message}`);
    }
  • 异步获取内置存储的可用空间大小。

    import { storageStatistics } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    storageStatistics.getFreeSize().then((number: number) => {
    console.info(`getFreeSize successfully, number is ${number}`);
    }).catch((err: BusinessError) => {
    console.error(`getFreeSize failed with error, code is ${err.code}, message is ${err.message}`);
    });
  • 同步获取内置存储的可用空间大小。

    import { storageStatistics } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    try {
    let number = storageStatistics.getFreeSizeSync();
    console.info(`getFreeSizeSync successfully, number is ${number}`);
    } catch (err) {
    let error: BusinessError = err as BusinessError;
    console.error(`getFreeSizeSync failed with error, code is ${error.code}, message is ${error.message}`);
    }