开发环境
- Mac
- DevEco Studio NEXT Developer Preview2
- HarmonyOS next Developer Preview2
认识鸿蒙文件系统
1、文件系统分类
在最新的Core File Kit套件中,按文件所有者的不同。分为如下三类:
应用文件
:文件所有者为应用
,包括应用安装文件、应用资源文件、应用缓存文件等。用户文件
:文件所有者为登录到该终端设备的用户
,包括用户私有的图片、视频、音频、文档等。系统文件
:与应用和用户无关的其它文件,包括公共库、设备文件、系统资源文件等。这类文件普通开发者不需要关注。
如图所示:
2、访问范围和方式
我们的应用缓存目录,实质是系统在内部存储空间
上映射出一个专属应用沙箱目录
其中的一部分,它是应用文件目录
与一部分系统文件(应用运行必需的少量系统文件)所在的目录组成的集合。
- 应用可以在
应用沙箱目录
下保存和处理自己的应用文件; - 系统文件及其目录对于应用是只读的;
- 应用若需访问
用户文件
,则需要通过特定API同时经过用户的相应授权才能进行(即读写权限申请)。
下图展示了在鸿蒙上,应用可访问的文件范围和方式:
3、应用文件目录与路径
如上图所示,这是应用文件的目录结构图。
- 一级目录data/:代表应用文件目录。
- 二级目录storage/:代表本应用持久化文件目录。
- 三级目录el1/、el2/:代表不同文件加密类型。
- el1,设备级加密区:设备开机后即可访问的数据区。
- el2,用户级加密区:设备开机后,需要至少一次解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)后,才能够访问的加密数据区。(应用如无特殊需要,应将数据存放在el2加密目录下,以尽可能保证数据安全。)
- 四级、五级目录:
- ApplicationContext:可以获取distributedfiles目录或者base下的files、cache、preferences、temp等目录的应用文件路径,应用全局信息可以存放在这些目录下。
- UIAbilityContext、AbilityStageContext、ExtensionContext:HAP级别应用文件路径(上图中的
haps/<module-name>/
下的目录)。HAP信息可以存放在这些目录下,存放在此目录的文件会跟随HAP的卸载而删除,不会影响App级别目录下的文件。
获取APP缓存大小
1、缓存目录介绍
- 目录名:cache
- Context属性名称:cacheDir
- 类型:应用缓存文件路径
- 说明:应用在本设备内部存储上,用于缓存下载的文件或可重新生成的缓存文件的路径,应用cache目录大小超过配额或者系统空间达到一定条件,
自动触发清理
该目录下文件;用户通过系统空间管理类应用也可能触发清理该目录
。应用需判断文件是否仍存在,决策是否需重新缓存该文件。 可以用于保存应用的缓存数据,主要包括离线数据、图片缓存、数据库备份以及临时文件等。此路径下存储的数据可能会被系统自动清理,因此不要存储重要数据。
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
3、获取缓存目录
el1分区获取:
- 切换到el1加密分区
ini
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
- 切换到el2加密分区
ini
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
4、获取缓存大小
javascript
import storageStatistics from "@ohos.file.storageStatistics";
const bundleStats = await storageStatistics.getCurrentBundleStats()
return bundleStats.cacheSize
5、清除缓存
typescript
static async cleanAppCache(context: Context): Promise<boolean> {
context.getApplicationContext().area = contextConstant.AreaMode.EL1;
context.area = contextConstant.AreaMode.EL1;
const el1AppCacheDir = context.getApplicationContext().cacheDir
const el1HapCacheDir = context.cacheDir
context.getApplicationContext().area = contextConstant.AreaMode.EL2;
context.area = contextConstant.AreaMode.EL2;
const el2AppCacheDir = context.getApplicationContext().cacheDir
const el2HapCacheDir = context.cacheDir
const 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)
})
})
}