HarmonyOS鸿蒙Next中实现复制文件功能示例代码

HarmonyOS鸿蒙Next中实现复制文件功能示例代码

介绍

本示例通过fileio.copyFileSync,以同步方法实现复制文件的功能。

实现复制文件功能源码链接

效果预览

图片名称

实现思路

  1. resource路径中,resfile中的文件在APP安装后自动解压到沙箱只读目录,通过context.resourceDir获取该只读路径。
  2. resource路径中,rawfile中的文件通过context.resourceManager.getRawFileContent(Sync)获取。
  3. filePicker得到外部文件临时URI,只读访问,通过管道复制到沙箱内新文件。
// 1. 若缓冲区永远大于文件最大大小,可一次搞定, 不建议设置超大缓冲区,文件过大请用下面第二个方法
let buf = new ArrayBuffer(4096);
let readLen = fs.readSync(fromFile.fd, buf);
let writeLen = fs.writeSync(toFile.fd, buf);
fs.closeSync(fromFile);
fs.closeSync(toFile);

// 2. 若文件大小不明确,缓冲执行
const BUFFER_SIZE = 4096
let buf = new ArrayBuffer(BUFFER_SIZE);
let totalSize = fs.statSync(fromFile.fd).size;
let writtenSize = 0;
while (writtenSize < totalSize) {
  let readLen = fs.readSync(fromFile.fd, buf, {
    offset: writtenSize, length: BUFFER_SIZE
  });
  let writeLen = fs.writeSync(toFile.fd, buf, {
    offset: writtenSize, length: readLen
  });
  writtenSize += writeLen;
}

fs.closeSync(fromFile);
fs.closeSync(toFile);
  1. resfile中的文件为只读访问且有确切目录,外部文件的临时URI是只读访问,因此这两个通过不同方式最终拿到文件都是采用fs.copyFileSync的方法。 rawFile中的文件则通过资源管理器API来获取其内容,可以看到其在大文件中不适合使用,大文件建议放在resfile中。

更多关于HarmonyOS鸿蒙Next中实现复制文件功能示例代码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS NEXT中实现文件复制可使用ohos.file.fsAPI。示例代码如下:

import fs from '@ohos.file.fs';

async function copyFile(srcPath: string, destPath: string) {
  try {
    await fs.copyFile(srcPath, destPath);
    console.log('File copied successfully');
  } catch (err) {
    console.error(`Copy failed: ${err.message}`);
  }
}

// 使用示例
let src = '/data/storage/el1/base/files/src.txt';
let dest = '/data/storage/el1/base/files/dest.txt';
copyFile(src, dest);

该代码通过FS模块的copyFile方法实现文件复制,需申请ohos.permission.FILE_ACCESSohos.permission.WRITE_USER_STORAGE权限。

更多关于HarmonyOS鸿蒙Next中实现复制文件功能示例代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现文件复制功能确实可以通过fileio.copyFileSync同步方法来完成。您提供的示例代码展示了两种典型的实现方式:

  1. 对于小文件,使用固定缓冲区一次性读取写入是简洁高效的方案。但需要注意缓冲区大小设置要合理,避免内存浪费。

  2. 对于大文件,采用分块读取写入的方式更为可靠。您展示的循环缓冲方案是标准做法,通过BUFFER_SIZE控制每次处理的块大小,配合offset参数确保数据完整性。

几点补充说明:

  • 资源文件(resfile)和原始文件(rawfile)的处理方式差异确实需要注意。
  • 文件操作完成后及时调用closeSync释放资源是好习惯。
  • 实际开发中建议添加错误处理逻辑。
  • 文件路径处理要特别注意沙箱限制。

您提供的Gitee链接中的完整示例很有参考价值,包含了上下文获取、路径处理等完整流程,建议开发者参考。

回到顶部