赞
踩
如下图所示,应用沙箱目录有两部分组成:应用文件和(少量)系统文件(只读)。本应用的文件对其他应用不可见,同样本应用也无法获取别的应用的沙箱目录下的文件。
一共有七级目录,其中禁止直接使用字符串来组成四级目录之前的路径,防止系统版本出现变化而导致的不兼容问题。
context.bundleCodeDir
获取。应用安装后的App的HAP资源包所在目录;随应用卸载而清理。不能拼接路径访问资源文件,请使用资源管理接口访问资源。可以用于存储应用的代码资源数据,主要包括应用安装的HAP资源包、可重复使用的库文件以及插件资源等。此路径下存储的代码资源数据可以被用于动态加载。context.databaseDir
获取,应用在el2加密条件下存放通过分布式数据库服务操作的文件目录;随应用卸载而清理。仅用于保存应用的私有数据库数据,主要包括数据库文件等。此路径下仅适用于存储分布式数据库相关文件数据。context.distributedFilesDir
获取。 应用在el2加密条件下存放分布式文件的目录,应用将文件放入该目录可分布式跨设备直接访问;随应用卸载而清理。可以用于保存应用分布式场景下的数据,主要包括应用多设备共享文件、应用多设备备份文件、应用多设备群组协助文件。此路径下存储这些数据,使得应用更加适合多设备使用场景。context.filesDir
获取。应用在本设备内部存储上通用的存放默认长期保存的文件路径;随应用卸载而清理。可以用于保存应用的任何私有数据,主要包括用户持久性文件、图片、媒体文件以及日志文件等。此路径下存储这些数据,使得数据保持私有、安全且持久有效。context.cacheDir
获取。应用在本设备内部存储上用于缓存下载的文件或可重新生成的缓存文件的路径,应用cache目录大小超过配额或者系统空间达到一定条件,自动触发清理该目录下文件;用户通过系统空间管理类应用也可能触发清理该目录。.应用需判断文件是否仍存在,决策是否需重新缓存该文件。可以用于保存应用的缓存数据,主要包括离线数据、图片缓存、数据库备份以及临时文件等。此路径下存储的数据可能会被系统自动清理,因此不要存储重要数据。context.preferencesDir
获取。可以用于保存应用的首选项数据,主要包括应用首选项文件以及配置文件等。此路径下仅适用于存储小量数据。,类似android sharePreference.context.tempDir
获取。 应用在本设备内部存储上仅在应用运行期间产生和需要的文件,。应用退出后即清理。可以用于保存应用的临时生成的数据,主要包括数据库缓存、图片缓存、临时日志文件、以及下载的应用安装包文件等。此路径下存储使用后即可删除的数据。可以使用ApplicationContext
获取文件路径,代码如下:
private context = getContext(this) as common.UIAbilityContext; //获取ApplicationContext let applicationContext = this.context.getApplicationContext(); let cacheDir = applicationContext.cacheDir; let tempDir = applicationContext.tempDir; let filesDir = applicationContext.filesDir; let databaseDir = applicationContext.databaseDir; let bundleCodeDir = applicationContext.bundleCodeDir; let distributedFilesDir = applicationContext.distributedFilesDir; let preferencesDir = applicationContext.preferencesDir; let cloudFileDir = applicationContext.cloudFileDir; console.log("file path cacheDir = "+cacheDir) console.log("file path tempDir = "+tempDir) console.log("file path filesDir = "+filesDir) console.log("file path databaseDir = "+databaseDir) console.log("file path bundleCodeDir = "+bundleCodeDir) console.log("file path distributedFilesDir = "+distributedFilesDir) console.log("file path preferencesDir = "+preferencesDir) console.log("file path cloudFileDir = "+cloudFileDir)
其目录结构如下:
打印日志如下:可以发现,默认状态下,除了bundle是el1目录下的,其余的获取的是el2目录下。
I file path cacheDir = /data/storage/el2/base/cache
I file path tempDir = /data/storage/el2/base/temp
I file path filesDir = /data/storage/el2/base/files
I file path databaseDir = /data/storage/el2/database
I file path bundleCodeDir = /data/storage/el1/bundle
I file path distributedFilesDir = /data/storage/el2/distributedfiles
I file path preferencesDir = /data/storage/el2/base/preferences
I file path cloudFileDir = /data/storage/el2/cloud
此路径是HAP相关信息推荐的存放路径,这些文件会跟随HAP的卸载而删除,但不会影响应用级别路径的文件,除非该应用的HAP已全部卸载。
let cacheDir = this.context.cacheDir; let tempDir = this.context.tempDir; let filesDir = this.context.filesDir; let databaseDir = this.context.databaseDir; let bundleCodeDir = this.context.bundleCodeDir; let distributedFilesDir = this.context.distributedFilesDir; let preferencesDir = this.context.preferencesDir; let cloudFileDir = this.context.cloudFileDir; console.log("file path cacheDir = "+cacheDir) console.log("file path tempDir = "+tempDir) console.log("file path filesDir = "+filesDir) console.log("file path databaseDir = "+databaseDir) console.log("file path bundleCodeDir = "+bundleCodeDir) console.log("file path distributedFilesDir = "+distributedFilesDir) console.log("file path preferencesDir = "+preferencesDir) console.log("file path cloudFileDir = "+cloudFileDir)
其目录结构如下图:
打印日志如下:(因为测试代码只有一个entry的hap);
I file path cacheDir = /data/storage/el2/base/haps/entry/cache
I file path tempDir = /data/storage/el2/base/haps/entry/temp
I file path filesDir = /data/storage/el2/base/haps/entry/files
I file path databaseDir = /data/storage/el2/database/entry
I file path bundleCodeDir = /data/storage/el1/bundle
I file path distributedFilesDir = /data/storage/el2/distributedfiles
I file path preferencesDir = /data/storage/el2/base/haps/entry/preferences
I file path cloudFileDir = /data/storage/el2/cloud
通过上面测试发现,默认获取到的除了bunlde之外,获取到的都是el2目录下的路径,那我们想要获取el1下的该怎么办?很简单,使用contextConstant切换。切换代码如下:
import { UIAbility, contextConstant, AbilityConstant, Want } from '@kit.AbilityKit'; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { // 存储普通信息前,切换到EL1设备级加密 this.context.area = contextConstant.AreaMode.EL1; // 切换area // 存储普通信息 // 存储敏感信息前,切换到EL2用户级加密 this.context.area = contextConstant.AreaMode.EL2; // 切换area // 存储敏感信息 // 存储敏感信息前,切换到EL3用户级加密 this.context.area = contextConstant.AreaMode.EL3; // 切换area // 存储敏感信息 // 存储敏感信息前,切换到EL4用户级加密 this.context.area = contextConstant.AreaMode.EL4; // 切换area // 存储敏感信息 } }
测试代码如下:
日志输出如下:(其中cloudFile是个例外)
I file path cacheDir = /data/storage/el1/base/haps/entry/cache
I file path tempDir = /data/storage/el1/base/haps/entry/temp
I file path filesDir = /data/storage/el1/base/haps/entry/files
I file path databaseDir = /data/storage/el1/database/entry
I file path bundleCodeDir = /data/storage/el1/bundle
I file path distributedFilesDir = /data/storage/el1/distributedfiles
I file path preferencesDir = /data/storage/el1/base/haps/entry/preferences
I file path cloudFileDir = /data/storage/el2/cloud
另外AreaMode是个枚举类型,包含EL0~EL5 五个值,每个值的含义如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。