鸿蒙5.0进阶开辟:应用文件-应用文件访问(ArkTS)

打印 上一主题 下一主题

主题 1772|帖子 1772|积分 5316

 往期鸿蒙5.0全套实战文章必看:(文中附带鸿蒙5.0全栈学习资料)



  • 鸿蒙开辟核心知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开辟实战学习路线
  • 鸿蒙HarmonyOS NEXT开辟技术最全学习路线指南
  • 鸿蒙应用开辟实战项目,看这一篇文章就够了(部门项目附源码)

应用文件访问(ArkTS)

应用必要对应用文件目次下的应用文件进行检察、创建、读写、删除、移动、复制、获取属性等访问操纵,下文介绍具体方法。
接口说明

开辟者通过基础文件操纵接口(ohos.file.fs)实现应用文件访问本事,主要功能如下表所示。
表1 基础文件操纵接口功能
接口名功能接口范例支持同步支持异步access检查文件是否存在方法√√close关闭文件方法√√copyFile复制文件方法√√createStream基于文件路径打开文件流方法√√listFile列出文件夹下所有文件名方法√√mkdir创建目次方法√√moveFile移动文件方法√√open打开文件方法√√read从文件读取数据方法√√rename重定名文件或文件夹方法√√rmdir删除整个目次方法√√stat获取文件具体属性信息方法√√unlink删除单个文件方法√√write将数据写入文件方法√√Stream.close关闭文件流方法√√Stream.flush刷新文件流方法√√Stream.write将数据写入流文件方法√√Stream.read从流文件读取数据方法√√File.fd获取文件形貌符属性--OpenMode设置文件打开标签属性--Filter设置文件过滤设置项范例--   注意
  利用基础文件操纵接口时,耗时较长的操纵,例如:read、write等,建议利用异步接口,避免应用崩溃。
  开辟示例

在对应用文件开始访问前,开辟者必要获取应用文件路径。以从UIAbilityContext获取HAP级别的文件路径为例进行说明,UIAbilityContext的获取方式请参见获取UIAbility的上下文信息。
下面介绍几种常用操纵示例。
新建并读写一个文件

以下示例代码演示了如何新建一个文件并对其读写。
  1. // pages/xxx.ets
  2. import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. import { buffer } from '@kit.ArkTS';
  5. // 获取应用文件路径
  6. let context = getContext(this) as common.UIAbilityContext;
  7. let filesDir = context.filesDir;
  8. function createFile(): void {
  9.   // 文件不存在时创建并打开文件,文件存在时打开文件
  10.   let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  11.   // 写入一段内容至文件
  12.   let writeLen = fs.writeSync(file.fd, "Try to write str.");
  13.   console.info("The length of str is: " + writeLen);
  14.   // 创建一个大小为1024字节的ArrayBuffer对象,用于存储从文件中读取的数据
  15.   let arrayBuffer = new ArrayBuffer(1024);
  16.   // 设置读取的偏移量和长度
  17.   let readOptions: ReadOptions = {
  18.     offset: 0,
  19.     length: arrayBuffer.byteLength
  20.   };
  21.   // 读取文件内容到ArrayBuffer对象中,并返回实际读取的字节数
  22.   let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
  23.   // 将ArrayBuffer对象转换为Buffer对象,并转换为字符串输出
  24.   let buf = buffer.from(arrayBuffer, 0, readLen);
  25.   console.info("the content of file: " + buf.toString());
  26.   // 关闭文件
  27.   fs.closeSync(file);
  28. }
复制代码
读取文件内容并写入到另一个文件

以下示例代码演示了如何从一个文件读写内容到另一个文件。
  1. // pages/xxx.ets
  2. import { fileIo as fs, ReadOptions, WriteOptions } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. // 获取应用文件路径
  5. let context = getContext(this) as common.UIAbilityContext;
  6. let filesDir = context.filesDir;
  7. function readWriteFile(): void {
  8.   // 打开文件
  9.   let srcFile = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  10.   let destFile = fs.openSync(filesDir + '/destFile.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  11.   // 读取源文件内容并写入至目的文件
  12.   let bufSize = 4096;
  13.   let readSize = 0;
  14.   let buf = new ArrayBuffer(bufSize);
  15.   let readOptions: ReadOptions = {
  16.     offset: readSize,
  17.     length: bufSize
  18.   };
  19.   let readLen = fs.readSync(srcFile.fd, buf, readOptions);
  20.   while (readLen > 0) {
  21.     readSize += readLen;
  22.     let writeOptions: WriteOptions = {
  23.       length: readLen
  24.     };
  25.     fs.writeSync(destFile.fd, buf, writeOptions);
  26.     readOptions.offset = readSize;
  27.     readLen = fs.readSync(srcFile.fd, buf, readOptions);
  28.   }
  29.   // 关闭文件
  30.   fs.closeSync(srcFile);
  31.   fs.closeSync(destFile);
  32. }
复制代码
  说明
  利用读写接口时,需注意可选项参数offset的设置。对于已存在且读写过的文件,文件偏移指针默认在上次读写操纵的停止位置。
  以流的情势读写文件

以下示例代码演示了如何利用流接口读取test.txt的文件内容并写入到destFile.txt文件中。
  1. // pages/xxx.ets
  2. import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. // 获取应用文件路径
  5. let context = getContext(this) as common.UIAbilityContext;
  6. let filesDir = context.filesDir;
  7. async function readWriteFileWithStream(): Promise<void> {
  8.   // 创建并打开输入文件流
  9.   let inputStream = fs.createStreamSync(filesDir + '/test.txt', 'r+');
  10.   // 创建并打开输出文件流
  11.   let outputStream = fs.createStreamSync(filesDir + '/destFile.txt', "w+");
  12.   let bufSize = 4096;
  13.   let readSize = 0;
  14.   let buf = new ArrayBuffer(bufSize);
  15.   let readOptions: ReadOptions = {
  16.     offset: readSize,
  17.     length: bufSize
  18.   };
  19.   // 以流的形式读取源文件内容并写入到目标文件
  20.   let readLen = await inputStream.read(buf, readOptions);
  21.   readSize += readLen;
  22.   while (readLen > 0) {
  23.     const writeBuf = readLen < bufSize ? buf.slice(0, readLen) : buf;
  24.     await outputStream.write(writeBuf);
  25.     readOptions.offset = readSize;
  26.     readLen = await inputStream.read(buf, readOptions);
  27.     readSize += readLen;
  28.   }
  29.   // 关闭文件流
  30.   inputStream.closeSync();
  31.   outputStream.closeSync();
  32. }
复制代码
  说明
  利用流接口时,需注意流的实时关闭。同时流的异步接口应严酷依照异步接口利用规范,避免同步、异步接口混用。流接口不支持并发读写。
  检察文件列表

以下示例代码演示了如何检察文件列表。
  1. import { fileIo as fs, Filter, ListFileOptions } from '@kit.CoreFileKit';
  2. import { common } from '@kit.AbilityKit';
  3. // 获取应用文件路径
  4. let context = getContext(this) as common.UIAbilityContext;
  5. let filesDir = context.filesDir;
  6. // 查看文件列表
  7. function getListFile(): void {
  8.   let listFileOption: ListFileOptions = {
  9.     recursion: false,
  10.     listNum: 0,
  11.     filter: {
  12.       suffix: [".png", ".jpg", ".txt"],
  13.       displayName: ["test*"],
  14.       fileSizeOver: 0,
  15.       lastModifiedAfter: new Date(0).getTime()
  16.     }
  17.   };
  18.   let files = fs.listFileSync(filesDir, listFileOption);
  19.   for (let i = 0; i < files.length; i++) {
  20.     console.info(`The name of file: ${files[i]}`);
  21.   }
  22. }
复制代码
利用文件流

以下示例代码演示了如何利用文件可读流,文件可写流。
  1. // pages/xxx.ets
  2. import { fileIo as fs } from '@kit.CoreFileKit';
  3. import { common } from '@kit.AbilityKit';
  4. // 获取应用文件路径
  5. let context = getContext(this) as common.UIAbilityContext;
  6. let filesDir = context.filesDir;
  7. function copyFileWithReadable(): void {
  8.   // 创建文件可读流
  9.   const rs = fs.createReadStream(`${filesDir}/read.txt`);
  10.   // 创建文件可写流
  11.   const ws = fs.createWriteStream(`${filesDir}/write.txt`);
  12.   // 暂停模式拷贝文件。在拷贝数据时,将原始数据暂停,然后将数据复制到另一个位置,适用于对数据完整性和一致性要求较高的场景
  13.   rs.on('readable', () => {
  14.     const data = rs.read();
  15.     if (!data) {
  16.       return;
  17.     }
  18.     ws.write(data);
  19.   });
  20. }
  21. function copyFileWithData(): void {
  22.   // 创建文件可读流
  23.   const rs = fs.createReadStream(`${filesDir}/read.txt`);
  24.   // 创建文件可写流
  25.   const ws = fs.createWriteStream(`${filesDir}/write.txt`);
  26.   // 流动模式拷贝文件。数据的读取和写入是同时进行的,不需要暂停原始数据的访问,适用于对数据实时性要求较高的场景
  27.   rs.on('data', (emitData) => {
  28.     const data = emitData?.data;
  29.     if (!data) {
  30.       return;
  31.     }
  32.     ws.write(data as Uint8Array);
  33.   });
  34. }
复制代码
利用文件哈希流

哈希流是一种数据传输和存储技术,可以将任意长度的数据转换为固定长度的哈希值来验证数据的完整性和一致性。以下代码演示了如何利用文件哈希处理接口(ohos.file.hash)来处理文件哈希流。
  1. // pages/xxx.ets
  2. import { fileIo as fs } from '@kit.CoreFileKit';
  3. import { hash } from '@kit.CoreFileKit';
  4. import { common } from '@kit.AbilityKit';
  5. // 获取应用文件路径
  6. let context = getContext(this) as common.UIAbilityContext;
  7. let filesDir = context.filesDir;
  8. function hashFileWithStream() {
  9.   const filePath = `${filesDir}/test.txt`;
  10.   // 创建文件可读流
  11.   const rs = fs.createReadStream(filePath);
  12.   // 创建哈希流
  13.   const hs = hash.createHash('sha256');
  14.   rs.on('data', (emitData) => {
  15.     const data = emitData?.data;
  16.     hs.update(new Uint8Array(data?.split('').map((x: string) => x.charCodeAt(0))).buffer);
  17.   });
  18.   rs.on('close', async () => {
  19.     const hashResult = hs.digest();
  20.     const fileHash = await hash.hash(filePath, 'sha256');
  21.     console.info(`hashResult: ${hashResult}, fileHash: ${fileHash}`);
  22.   });
  23. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表