官方文档:Core File Kit简介
目录标题
文件分类
1. 应用文件
文件所有者为应用,比如应用的安装包,自己的资源文件等。
2. 用户文件
文件所有者为用户,比如用户自己的照片,录制的音视频等。
应用沙箱目录
应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为“应用沙箱目录
”。这个目录包含:应用文件目录
和一部分系统文件目录
,这俩目录的合集,就是应用沙箱目录。
应用文件目录
- 一级目录
data/
:代表应用文件目录。 - 二级目录
storage/
:代表本应用持久化文件目录。 - 三级目录
el1/
、el2/
:代表不同文件加密类型。
el1
,设备级加密区:设备开机后即可访问的数据区。
el2
,用户级加密区:设备开机后,需要至少一次解锁对应用户的锁屏界面(密码、指纹、人脸等方式或无密码状态)后,才能够访问的加密数据区。 - 四级、五级目录:
通过ApplicationContext
可以获取distributedfiles
目录或base
下的files
、cache
、preferences
、temp
等目录的应用文件路径,应用全局信息可以存放在这些目录下。
通过UIAbilityContext
、AbilityStageContext
、ExtensionContext
可以获取HAP
级别应用文件路径。
应用文件路径 :参考官方文档即可
样例:获取文件目录
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index_file_basic {
private context = getContext(this) as common.UIAbilityContext;
@Builder
readData() {
Text('数据读取区').margin(5)
Column() {
Text('安装文件路径:bundle:')
TextInput({ text: this.context ? this.context.bundleCodeDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
// Column() {
// // 本设备文件路径:应用在本设备存放持久化数据目录
// Text('base:')
// // 获取base通过NA属性,但是没有
// TextInput({ text: this.context ? this.context.NA : "" }).backgroundColor(Color.White).width('100%')
// }.padding(5).alignItems(HorizontalAlign.Start)
Column() {
Text('数据库:database:')
TextInput({ text: this.context ? this.context.databaseDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
Column() {
Text('分布式文件路径:distributedfiles:')
TextInput({ text: this.context ? this.context.distributedFilesDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
// 通用文件路径:图片,媒体文件,日志文件
// 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
// 因为咱们得代码最终是打包到了entry的hap包下
// /data/storage/el2/base/haps/entry/files
Column() {
Text('应用通用文件路径:files:')
TextInput({ text: this.context ? this.context.filesDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
//应用缓存路径
// 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
// 因为咱们得代码最终是打包到了entry的hap包下
// /data/storage/el2/base/haps/entry/cache
Column() {
Text('应用缓存文件路径:cache:')
TextInput({ text: this.context ? this.context.cacheDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
//Preference路径
// 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
// 因为咱们得代码最终是打包到了entry的hap包下
// /data/storage/el2/base/haps/entry/preferences
Column() {
Text('应用首选项文件路径 :preference:')
TextInput({ text: this.context ? this.context.preferencesDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
//temp路径
// 注意:获取到的是entry模块打包后的hap下的路径(7级路径),不是应用下的路径(5级路径)
// 因为咱们得代码最终是打包到了entry的hap包下
// /data/storage/el2/base/haps/entry/temp
Column() {
Text('应用临时文件路径:temp:')
TextInput({ text: this.context ? this.context.tempDir : "" }).backgroundColor(Color.White).width('100%')
}.padding(5).alignItems(HorizontalAlign.Start)
}
build() {
Column() {
Column() {
this.readData()
}
.width('100%')
.height('100%')
.padding(10)
.backgroundColor(0xe0e0e0)
}
}
}
样例:文件管理-应用文件-访问
- openSync , 同步打开 , 可以新建并打开一个文件
- writeSync,同步写
- readSync,同步读
import fs, { ReadOptions } from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import { buffer } from '@kit.ArkTS';
@Entry
@Component
struct Index_operate_file {
@State content: string = ''
@State result: string = ''
private context = getContext(this) as common.UIAbilityContext;
@Builder
saveData() {
Text('数据保存区').margin(5)
Row() {
Text('内容:')
TextInput({ text: '', placeholder: "请输入内容" })
.backgroundColor(Color.White)
.width('90%')
.onChange((value) => {
this.content = value
})
}
.padding(5)
Button('写入数据')
.fontSize(18)
.width('50%')
.fontWeight(FontWeight.Bold)
.padding(8)
.margin(10)
.onClick(() => {
this.saveFileContent()
})
}
@Builder
readData() {
Text('数据读取区').margin(5)
Row() {
Text('内容:')
TextInput({ text: this.result })
.backgroundColor(Color.White)
.width('90%')
}.padding(5)
Button('读取数据')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.width('50%')
.padding(8)
.margin(10)
.onClick(() => {
this.readFileContent()
})
}
// 写入文件一段内容
saveFileContent() {
// 获取应用文件路径
let filesDir = this.context.filesDir;
// 新建并打开文件
let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fs.writeSync(file.fd, this.content);
console.log("test", "The length of str is: " + writeLen)
AlertDialog.show({ message: '写入成功' })
}
// 从文件读取一段内容
readFileContent() {
// 打开文件
let filesDir = this.context.filesDir;
let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 读取文件
let arrayBuffer = new ArrayBuffer(1024);
let readOptions: ReadOptions = {
offset: 0,
length: arrayBuffer.byteLength
};
let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info("the content of file: " + buf.toString());
this.result = buf.toString()
// 关闭文件
fs.closeSync(file);
}
build() {
Row() {
Column() {
this.saveData()
Divider().margin(20)
this.readData()
}
.width('100%')
.height('100%')
.padding(10)
.backgroundColor(0xe0e0e0)
}
}
}
样例:文件管理-应用文件-空间大小
import storageStatistics from "@ohos.file.storageStatistics";
import statvfs from '@ohos.file.statvfs';
@Entry
@Component
struct Index_get_space_size {
@State appSpace: number = 0
@State freeSpace: number = 0
@Builder
getAppSpace() {
Text('应用存储空间大小').margin(5)
Row() {
Text('大小:')
TextInput({ text: (this.appSpace / 1024).toString() + 'KB', placeholder: "待获取" }).backgroundColor(Color.White).width('90%')
}
.padding(5)
Button('获取')
.fontSize(18)
.width('50%')
.fontWeight(FontWeight.Bold)
.padding(8)
.margin(10)
.onClick(() => {
storageStatistics.getCurrentBundleStats((err, bundleStats) => {
console.info(`succeeded, appsize is ${bundleStats.appSize}`);
this.appSpace = bundleStats.appSize
});
})
}
@Builder
getFreeSpace() {
Text('系统剩余空间大小').margin(5)
Row() {
Text('大小:')
TextInput({ text: (this.freeSpace / 1024).toString() + 'KB', placeholder: "待获取" }).backgroundColor(Color.White).width('90%')
}.padding(5)
Button('获取')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.width('50%')
.padding(8)
.margin(10)
.onClick(() => {
let path = "/data";
statvfs.getFreeSize(path, (err, number) => {
console.info(`succeeded, size is ${number} M`);
this.freeSpace = number
});
})
}
build() {
Row() {
Column() {
this.getAppSpace()
Divider().margin(20)
this.getFreeSpace()
}
.width('100%')
.height('100%')
.padding(10)
.backgroundColor(0xe0e0e0)
}
}
}
样例:文件管理-用户文件-选择图片
import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct Index_select_pic {
@State pic:string = ''
build() {
Column() {
Text('选择喜欢的图片').margin(5)
Row() {
Text('图片:')
Image(this.pic)
.width(200)
.height(200)
.objectFit(ImageFit.Fill)
}
.padding(5)
Button('选择图片')
.fontSize(18)
.width('50%')
.fontWeight(FontWeight.Bold)
.padding(8)
.margin(10)
.onClick(() => {
const photoSelectOptions = new picker.PhotoSelectOptions();
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
let URI = '';
const photoViewPicker = new picker.PhotoViewPicker();
photoViewPicker.select(photoSelectOptions).then((photoSelectResult) => {
URI = photoSelectResult.photoUris[0];
console.info('succeed and URI is:' + URI);
//直接将uri给图片路径变量即可
this.pic = URI
}).catch((err:BusinessError) => {
let error: BusinessError = err as BusinessError;
console.error('PhotoViewPicker failed with err: ' + JSON.stringify(error));
})
})
}
.width('100%')
.height('100%')
.padding(10)
.backgroundColor(0xe0e0e0)
}
}