当前位置: 首页 > news >正文

鸿蒙Next开发 获取APP缓存大小和清除缓存

1. 鸿蒙Next开发 获取APP缓存大小和清除缓存

1.1. 介绍

1.1.1. 文件系统分类

  在最新的Core File Kit套件中,按文件所有者的不同。分为如下三类:
  (1)应用文件:文件所有者为应用,包括应用安装文件、应用资源文件、应用缓存文件等。
  (2)用户文件:文件所有者为登录到该终端设备的用户,包括用户私有的图片、视频、音频、文档等。
  (3)系统文件:与应用和用户无关的其它文件,包括公共库、设备文件、系统资源文件等。这类文件普通开发者不需要关注。
在这里插入图片描述

1.1.2. 访问范围和方式

  我们的应用缓存目录,实质是系统在内部存储空间上映射出一个专属应用沙箱目录其中的一部分,它是应用文件目录与一部分系统文件(应用运行必需的少量系统文件)所在的目录组成的集合。
  (1)应用可以在应用沙箱目录下保存和处理自己的应用文件;
  (2)系统文件及其目录对于应用是只读的;
  (3)应用若需访问用户文件,则需要通过特定API同时经过用户的相应授权才能进行(即读写权限申请)。
  下图展示了在鸿蒙上,应用可访问的文件范围和方式:
在这里插入图片描述

1.1.2. 应用文件目录与路径

在这里插入图片描述
如上图所示,这是应用文件的目录结构图。
  一级目录data/:代表应用文件目录。
  二级目录storage/:代表本应用持久化文件目录。
  三级目录el1/、el2/:代表不同文件加密类型。
    el1,设备级加密区:设备开机后即可访问的数据区。
    el2,用户级加密区:设备开机后,需要至少一次解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)后,才能够访问的加密数据区。(应用如无特殊需要,应将数据存放在el2加密目录下,以尽可能保证数据安全。)
  四级、五级目录:
  ApplicationContext:可以获取distributedfiles目录或者base下的files、cache、preferences、temp等目录的应用文件路径,应用全局信息可以存放在这些目录下。
  UIAbilityContext、AbilityStageContext、ExtensionContext:HAP级别应用文件路径(上图中的haps//下的目录)。HAP信息可以存放在这些目录下,存放在此目录的文件会跟随HAP的卸载而删除,不会影响App级别目录下的文件。

1.2. 获取APP缓存大小

1.2.1. 缓存目录介绍

  目录名:cache
  Context属性名称:cacheDir
  类型:应用缓存文件路径
  说明:应用在本设备内部存储上,用于缓存下载的文件或可重新生成的缓存文件的路径,应用cache目录大小超过配额或者系统空间达到一定条件,自动触发清理该目录下文件;用户通过系统空间管理类应用也可能触发清理该目录。应用需判断文件是否仍存在,决策是否需重新缓存该文件。 可以用于保存应用的缓存数据,主要包括离线数据、图片缓存、数据库备份以及临时文件等。此路径下存储的数据可能会被系统自动清理,因此不要存储重要数据。

1.2.2. 缓存目录路径

/data/storage/el1/base/cache
/data/storage/el1/base/haps/entry/cache
/data/storage/el2/base/cache
/data/storage/el2/base/haps/entry/cache

1.2.3. 获取缓存目录

  el1分区获取:
  (1)切换到el1加密分区

context.getApplicationContext().area = contextConstant.AreaMode.EL1;
context.area = contextConstant.AreaMode.EL1;
context.getApplicationContext().cacheDir
context.cacheDir
//结果:
/data/storage/el1/base/cache
/data/storage/el1/base/haps/app/cache

  (2)切换到el2加密分区

context.getApplicationContext().area = contextConstant.AreaMode.EL2;
context.area = contextConstant.AreaMode.EL2;
context.getApplicationContext().cacheDir
context.cacheDir
//结果:
/data/storage/el2/base/cache
/data/storage/el2/base/haps/app/cache

1.2.4. 获取缓存大小

import storageStatistics from "@ohos.file.storageStatistics";
const bundleStats = await storageStatistics.getCurrentBundleStats()
return bundleStats.cacheSize

1.2.5. 清除缓存

static async cleanAppCache(context: Context): Promise<boolean> {context.getApplicationContext().area = contextConstant.AreaMode.EL1;context.area = contextConstant.AreaMode.EL1;const el1AppCacheDir = context.getApplicationContext().cacheDirconst el1HapCacheDir = context.cacheDircontext.getApplicationContext().area = contextConstant.AreaMode.EL2;context.area = contextConstant.AreaMode.EL2;const el2AppCacheDir = context.getApplicationContext().cacheDirconst el2HapCacheDir = context.cacheDirconst task = [AppInfoUtils.clearCacheTask(el1AppCacheDir),AppInfoUtils.clearCacheTask(el1HapCacheDir),AppInfoUtils.clearCacheTask(el2AppCacheDir),AppInfoUtils.clearCacheTask(el2HapCacheDir)]await Promise.all(task)return true
}private static clearCacheTask(dir: string): Promise<boolean> {return new Promise((resolve) => {fileIo.access(dir).then((exist: boolean) => {if (exist) {fileIo.rmdir(dir)}resolve(true)})})
}

1.3. 示例

1.3.1. 获取缓存大小

  storageStatistics.getCurrentBundleStats 第三方应用异步获取当前应用存储空间大小(单位为Byte),以Promise方式返回。

  @Statecache: string = ''calcCache() {
//获取当前应用的资源信息storageStatistics.getCurrentBundleStats().then(res => {this.cache = (res.cacheSize / (1000 * 1000)).toFixed(2) + 'MB'})}onPageShow(): void {this.calcCache()}

1.3.2. 清理缓存

  (1)accessSync(path: string, mode?: AccessModeType): boolean 以同步方法检查文件是否存在。
  (2)rmdirSync(path: string): void 以同步方法删除目录。
  (3)应用有两个缓存目录,一个 entry hap的,一个应用的
  实现步骤:获取上下文–》获取cache目录–》判断是否有该目录–》删除该目录。

clearCache() {const ctx = getContext()
//获取当前ability的缓存路径const ctxCacheDir = ctx.cacheDir
//判断是否有这个文件const ctxExist = fileIo.accessSync(ctxCacheDir)if (ctxExist) {
//清除缓存fileIo.rmdirSync(ctxCacheDir)}
//获得应用级的上下文const app = ctx.getApplicationContext()
//应用级的缓存目录const appCacheDir = app.cacheDir
//判断有无文件const appExist = fileIo.accessSync(appCacheDir)if (appExist) {
//清除缓存fileIo.rmdirSync(appCacheDir)}promptAction.showToast({ message: '清理完毕' })this.calcCache()}

相关文章:

  • Open Source Geospatial Content Management System -GeoNode
  • 《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》
  • Leetcode 3547. Maximum Sum of Edge Values in a Graph
  • Excelize 开源基础库发布 2.9.1 版本更新
  • win部署Jenkins 自动化部署发布后端项目
  • 6. 多列布局/用户界面 - 杂志风格文章布局
  • RabbitMQ 核心概念与消息模型深度解析(一)
  • centos中libc.so.6No such file的解决方式
  • 尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)
  • 专栏项目框架介绍
  • wpf DataGrid 行选择 命令绑定
  • vscode不能跳转到同一个工作区的其他文件夹
  • 阿里二面:聊聊 MySQL 主从同步方案的优缺点
  • 从虚拟现实到混合现实:沉浸式体验的未来之路
  • STM32 变量加载到flash的过程中
  • python打卡day24
  • 芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案
  • DELL R770 服务器,更换RAID卡教程!
  • 从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation
  • 智能体的典型应用:自动驾驶、智能客服、智能制造、游戏AI与数字人技术
  • 世界期待中美对话合作带来更多确定性和稳定性
  • 老人将房产遗赠给外孙,三个女儿却认为遗嘱应无效,法院判了
  • 科普|“小”耳洞也会引发“大”疙瘩,如何治疗和预防?
  • 做街坊们的“健康管家”,她把专科护理服务送上门
  • 韩国总统大选候选人登记结束,共7人参选
  • 哈尔滨工业大学原副校长王魁业逝世,享年92岁