前言

学习HarmonyOS的朋友们有福了,今天我在官网看到HarmonyOS第一课课程中的中级课程内有一篇【文件访问与操作】的课程,我跟着学习了一番,发现相当的好啊。整个分为四个部分,下图中可以看到,我们主要学习的是第三个部分的访问和操作文件的方法,之前我对文件操作的时候其实还是很模糊的,就是对json文件进行读写操作,还是在网友帮助下搞的一个固定写法,后来发现了这个,后面对文件的操作就有规范性指导意义了。

学习小技巧

过程中我发现概览的下方超链接可以直接控制视频的跳转位置,有一定HarmonyOS开发能力的可以直接跳转到这里,能直接获取到最直接的学习内容。

知识点解析

1、沙箱路径获取

这里说的就是文件的相对路径获取,是一切的前提,所以他的讲解顺序是很OK的,

这里是我平时用的读取方法,可以在第一部分看到我是直接获取应用文件路径,然后直接获取filesDir的通用文件路径,有了基础路径之后进行文件的是否存在与是否创建的判定操作,这样就可以像json文件中写内容了,如果是图片什么的就能直接判断是否使用或者是用其它代替图片。

  /**
   * 基础json操作函数
   * @param fileUrl
   * @param arr
   * @param userInfo
   * @returns
   */
  private createBase(fileUrl: string, arr: Array<Infos> | UserInfo | string | null) {
    // 获取应用文件路径
    let context = getContext(this) as common.UIAbilityContext;
    let filesDir = context.filesDir;
    // 新建并打开文件以进行写入操作,如果文件不存在则创建新文件
    let file = fileIo.openSync(filesDir.concat(fileUrl), fileIo.OpenMode.WRITE_ONLY | fileIo.OpenMode.CREATE);
    // 写入一段内容至文件
    let writeLen = 0;
    if (arr != null) {
      writeLen = fileIo.writeSync(file.fd, JSON.stringify(arr));
    }
    fileIo.closeSync(file);
    return writeLen;
  }

2、打开文件

打开文件的官方逻辑是用的open函数,上文中我使用的是异步处理,但是也是open的函数操作,能看到我提供的代码是使用的openSync,其实操作是一样的,我最终是写入,官方示例是打开后进行了关闭,中间输出了一下控制台信息。

这里要注意的是:OpenMode的枚举值,这里给了两个,READ_WRITE是写入的,并且给了个或的运算符,后面跟随的是CREATE创建操作枚举值,也就是如果有这个文件就能进行写入操作,如果没有则创建这个文件。我上文用的是WRITE_ONLY这是枚举值是只进行写入操作。

这里的沙箱路径已经在第一个步骤获取成功了。

3、读取文件

读取文件这用的是read函数,并且给了详细的参数说明,我喜欢这里,毕竟我自己去学习的时候是没有这些直接的说明都是自己找的,很消耗时间,有了这个就能大大的降低参数理解所对应的时间消耗。

这里要注意的是缓冲区buffer会返回读取内容获取到的长度,我们可以根据这个长度来判断是否有内容,内容量如何等信息,还是很有用的。

options是期望长度,可以进行设置,也就是我们想读取多少就是多少。

这是我使用的读取代码部分函数,我将内容直接转换成了String类型,方便后面操作,使用的是readSync函数,也是一样的,异步操作下对应用的用户体验会好一些,其实也都差不多,就是几十毫秒的事情。

  /**
   * 读取json返回string
   * @returns
   */
  private readFile(type : number): string {
    let context = getContext(this) as common.UIAbilityContext;
    if (!context) {
      console.info("无法获取有效的上下文");
      return "";
    }
    let filesDir = context.filesDir;
    // 新建并打开文件
    let file = fileIo.openSync(filesDir.concat(type==0?this.fileName:this.fileUser), fileIo.OpenMode.READ_ONLY | fileIo.OpenMode.CREATE);

    let bufferSize = 1024;
    let arrayBuffer = new ArrayBuffer(bufferSize);

    class Option {
      public offset: number = 0;
      public length: number = bufferSize;
    }

    let option = new Option();
    let content: string = "";
    let readLen: number = 0;
    do {
      // 读取文件内容到数组缓冲区
      readLen = fileIo.readSync(file.fd, arrayBuffer, option);
      if (readLen > 0) {
        let buf = buffer.from(arrayBuffer, 0, readLen);
        content += buf.toString();
        // 更新下一次读取的偏移量,继续从文件后续位置读取
        option.offset += readLen;
      }
    } while (readLen === bufferSize);
    // 关闭文件
    fileIo.closeSync(file);
    return content;
  }

4、写入文件

写入文件与读取文件差不多,区别就是将read更换成了write函数,这里的参考代码给的很详细,我在上文的代码中也给了对应的异步操作实际的代码样例,可以作为参考。

5、压缩文件与解压文件

这是个很好的功能,移动端的压缩与解压一直是很苦恼的事情,我之前也是特意搜索过,但是相关内容不怎么好找,一直没有个消息,但是在HarmonyOS第一课中竟然看到了,真真真的是很欣喜,有了这个再也不用怕移动端的压缩与解压的问题了。

6、文件预览

Preview我们很熟悉,毕竟每次开发的右侧都会存在我们的预览框,但是这里的预览是文件的预览,并非是直接下载而只是打开预览窗口而已,这个可以作为文件的概览来使用,很不错哦。

7、获取存储空间大小

这里可以通过getCurrentBundleStats函数来直接获取当前应用的存储空间大小,分别是安装文件大小,缓存文件大小,应用文件存储大小三个信息,这三个信息在我们做文件判断的时候很重要,下载的进度条也需要根据这个来判断。

利用这个我们在文件操作的时候就可以完成具体的移动端本地文件操作了,很是效率。

这里是压缩部分的代码示例,在内容的右侧也给了一个完整的代码说明,可以说HarmonyOS第一课的课程内容还是非常不错的呢。

总结

在HarmonyOS第一课的中级课程中有幸能看到专门针对文件操作的视频非常的荣幸,我在文件操作者出现过好多次问题,有了这个指导视频后面再遇到文件操作就能轻松顺利的解决了,课程内容的价值是非常高的,同时也希望本文能为更多的开发者们带来更多的价值。

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

Logo

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

更多推荐