上一节我们结合Core File Kit和Image Kit实现了位图数据转存为图片文件的功能,当时图片文件位于应用的沙箱目录下。应用沙箱是一种以安全防护为目的的隔离机制,避免数据受到恶意路径穿越访问。在这种沙箱的保护机制下,应用可见的目录范围即为“应用沙箱目录”。
不光图片要保存应用沙箱目录下,凡是App要读写的所有文件都必须放在沙箱目录,包括网络文件下载的保存目录,以及待上传文件的所在目录,都要求位于应用的沙箱目录。那么短视频App制作的自媒体视频,也得先从相册路径复制到应用的沙箱目录,才能向服务器提交上传。那么根据沙箱文件的操作规范,可将完整的文件复制过程划分为下列三个步骤:

一、各自打开复制操作的源文件和目标文件

鸿蒙把文件操作能力封装到了Core File Kit(文件基础服务),并通过fileIo工具来调用文件操作函数。为此要在代码开头添加下面的导包语句,表示引入文件操作工具fileIo:

import { fileIo } from '@kit.CoreFileKit';

鸿蒙把创建文件和打开文件合并到了一起,调用open函数或者openSync函数,即可实现创建并打开文件的功能。注意,在调用open或者openSync的时候,模式参数要填“fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE”,表示指定路径若不存在文件就创建新文件,若已存在文件就打开原文件。示例代码如下:

let srcFile = fileIo.openSync(path.toString());
let dstFile = fileIo.openSync(dstPath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);

二、把文件从源路径复制到应用沙箱的目标路径

调用fileIo工具的copyFile函数或者copyFileSync函数,即可实现复制文件的功能。示例代码如下:

fileIo.copyFileSync(srcFile.fd, dstFile.fd);

三、复制完毕,关闭第一步的源文件和目标文件

调用fileIo工具的close函数或者closeSync函数,即可实现关闭文件的功能。示例代码如下:

fileIo.closeSync(srcFile);
fileIo.closeSync(dstFile);

综合上述三个步骤,可编写把文件复制到沙箱目录的代码框架如下所示:

copyFile(path: string) {
  let fileName = path.toString().split('/').pop() as string;
  let dstPath = `${this.context.cacheDir}/${fileName}`
  let srcFile = fileIo.openSync(path.toString());
  let dstFile = fileIo.openSync(dstPath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
  fileIo.copyFileSync(srcFile.fd, dstFile.fd);
  fileIo.closeSync(srcFile);
  fileIo.closeSync(dstFile);
}

下一篇文章会介绍如何呈现正在上传文件的界面等待效果。

Logo

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

更多推荐