前言

HarmonyOS第一课中的课程不仅仅是视频内容详细,对应的文档也是相当细致的,上篇文章我们对文件访问与操作的函数进行了充分的学习,本篇文章我们对文件访问与操作的具体实操代码再次进行深入的学习,这样会更好的融入到我们的开发头脑中,使用的时候会自动迸发出对应的内容。

详细文档课程内容

这里的文档我参考看过了,那是相当的详细,从基础概述到详细的参数列表都在,可以在:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C601742806543228227?pathId=101667550095504391中查阅,我们来具体学习一番。

1、概述说明

这里给的是ohos.file.fs的详细说明,并且附录了对应的接口函数列表。

可以说一个函数列表就把所有的API都说明了,有了这个完全就是一目了然。

2、开发示例

把功能模块化,用基础的功能单位进行示例说明,按照当前基础功能单位进行拼接即可完成对应的功能,这个量化方案我就是很喜欢。

新建并读写一个文件

以下示例代码演示了如何新建一个文件并对其读写。

// pages/xxx.ets
import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { buffer } from '@kit.ArkTS';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;

function createFile(): void {
  // 文件不存在时创建并打开文件,文件存在时打开文件
  let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  // 写入一段内容至文件
  let writeLen = fs.writeSync(file.fd, "Try to write str.");
  console.info("The length of str is: " + writeLen);
  // 创建一个大小为1024字节的ArrayBuffer对象,用于存储从文件中读取的数据
  let arrayBuffer = new ArrayBuffer(1024);
  // 设置读取的偏移量和长度
  let readOptions: ReadOptions = {
    offset: 0,
    length: arrayBuffer.byteLength
  };
  // 读取文件内容到ArrayBuffer对象中,并返回实际读取的字节数
  let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
  // 将ArrayBuffer对象转换为Buffer对象,并转换为字符串输出
  let buf = buffer.from(arrayBuffer, 0, readLen);
  console.info("the content of file: " + buf.toString());
  // 关闭文件
  fs.closeSync(file);
}

这个示例中能看到上方是写入操作,是Try to write str.写入了一下文本进行的测试,后面是通过readSync的方式进行异步读取,并最终将结果输入到控制台进行显示,给的是一个完整读写示例,有了这个示例能完成基础的数据写入操作,很方便的。

读取文件内容并写入到另一个文件

后面又给了个如何从一个文件读写内容到另一个文件,这就相当于复制操作了呢,如果加上删除操作,这不就完成了剪切板的功能了,就很方便。

// pages/xxx.ets
import { fileIo as fs, ReadOptions, WriteOptions } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;

function readWriteFile(): void {
  // 打开文件
  let srcFile = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  let destFile = fs.openSync(filesDir + '/destFile.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  // 读取源文件内容并写入至目的文件
  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = {
    offset: readSize,
    length: bufSize
  };
  let readLen = fs.readSync(srcFile.fd, buf, readOptions);
  while (readLen > 0) {
    readSize += readLen;
    let writeOptions: WriteOptions = {
      length: readLen
    };
    fs.writeSync(destFile.fd, buf, writeOptions);
    readOptions.offset = readSize;
    readLen = fs.readSync(srcFile.fd, buf, readOptions);
  }
  // 关闭文件
  fs.closeSync(srcFile);
  fs.closeSync(destFile);
}

从流文件上就能看到两个文件的区别,srcFile与destFile两个文件进行读取与写入操作,这里最后也很严谨的进行了关闭文件操作,防止后面无法删除。

以流的形式读写文件

流方式的操作也给了具体的代码,演示了如何使用流接口读取test.txt的文件内容并写入到destFile.txt文件中。

// pages/xxx.ets
import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;

async function readWriteFileWithStream(): Promise<void> {
  // 创建并打开输入文件流
  let inputStream = fs.createStreamSync(filesDir + '/test.txt', 'r+');
  // 创建并打开输出文件流
  let outputStream = fs.createStreamSync(filesDir + '/destFile.txt', "w+");

  let bufSize = 4096;
  let readSize = 0;
  let buf = new ArrayBuffer(bufSize);
  let readOptions: ReadOptions = {
    offset: readSize,
    length: bufSize
  };
  // 以流的形式读取源文件内容并写入到目标文件
  let readLen = await inputStream.read(buf, readOptions);
  readSize += readLen;
  while (readLen > 0) {
    const writeBuf = readLen < bufSize ? buf.slice(0, readLen) : buf;
    await outputStream.write(writeBuf);
    readOptions.offset = readSize;
    readLen = await inputStream.read(buf, readOptions);
    readSize += readLen;
  }
  // 关闭文件流
  inputStream.closeSync();
  outputStream.closeSync();
}

后面还有查看文件列表、使用文件流、使用文件哈希流的示例操作,这些用起来就很方便,相当于给我们开发者们留了一个完全可用来拼接项目的积木,改成自己格式的格式就能直接使用,超方便。

3、授权持久化

持久化这个需要说一下,毕竟不能都在缓存里面操作,这里也被单独的写了一篇文章,我们可以看一下实际的操作场景,以及具体的添加【ohos.permission.FILE_ACCESS_PERSIST】的步骤,这个步骤是给了额外的连接的,方便我们直接跳转查阅。参考地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/determine-application-mode-V5

在对应的配置文档种我看到了权限的整个分配流程,这个图非常不错,不知道谁画的,给这个作者点个赞。

4、完整的开发示例

在连接中你能看到完整的开发示例:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C601742806543228227?pathId=101667550095504391 并且有完整的示例代码可以参考:

看起来都非常的美妙,我要下载看看。

这是完整的代码示例,能不能跑起来我们测试一下就行,我这里用的是【DevEco Studio 6.0】的开发工具。

确认可以直接打开的,编译和运行也都是很顺利的。

每个步骤都给了实际的操作代码示例:

5、考核验证

我们学习完毕了还可以考试一下,这样就能再次巩固一下,效果会更好,给了5个题目,判断2个单选两个,还有一个多选题,我还算很顺利的拿到了100分。

登录后会有证书哦。

证书样式:

总结

我们通过两篇文章的学习相信大家对于文件的访问与操作肯定是熟悉了的,并且HarmonyOS第一课又提供了完整的示例代码,我们完全可以使用其进行真实的应用开发了,整体上学习的时间节约了很多,毕竟相关的内容都一并呈现了出来,感谢平台的馈赠,大大的降低了学习技术的时间。

更多精彩内容,请关注公众号:【名称:HarmonyOS开发者技术,ID:HarmonyOS_Dev】;也欢迎加入鸿蒙开发者交流群:https://work.weixin.qq.com/gm/48f89e7a4c10206e053e01ad124004a0

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐