HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在

HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在

我想把备份的数据库拷贝到指定路径,在执行moveFile函数的时候一直说源路径不在,是不是我数据库备份路径那一步获取可访问URL有问题啊

image

image

image

image


更多关于HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

【背景知识】

【问题定位】

根据截图代码,可以复现问题。更改uri为需要备份的文件的同级目录,发现备份成功:

Button("数据移动")
  .onClick(async () => {
    const sqlUrl = this.getUIContext().getHostContext()?.databaseDir + '/rdb/RdbTest.db'
    const uri = this.getUIContext().getHostContext()?.databaseDir + '/rdb/RdbTest.db.back'
    console.log('源文件应用沙箱路径:' + sqlUrl)
    console.log('目标文件的应用沙箱路径:' + uri)
    try {
      await fileIo.moveFile(sqlUrl, uri)
      this.getUIContext().getPromptAction().showToast({ message: '备份成功' })
    } catch (err) {
      console.log('备份失败' + JSON.stringify(err))
    }
  })

【分析结论】

报错是move的目标位置获取失败导致的,但是开发者需要把文件保存到系统目录,建议使用picker。

【修改建议】

建议使用picker选取文件:

Button('保存至沙箱目录')
  .onClick(() => {
    const documentSaveOptions = new picker.DocumentSaveOptions();
    documentSaveOptions.newFileNames = ["RdbTest_Back.db"];
    documentSaveOptions.fileSuffixChoices = ['.db'];
    let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
    const documentViewPicker = new picker.DocumentViewPicker(context);
    documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array<string>) => {
      let uri = documentSaveResult[0];
      if (uri) {
        let sanFile = fileIo.openSync(`${this.getUIContext().getHostContext()?.databaseDir}/rdb/RdbTest.db`, fileIo.OpenMode.READ_WRITE)
        let pubFile = fileIo.openSync(uri, fileIo.OpenMode.READ_WRITE)
        fileIo.copyFileSync(sanFile.fd, pubFile.fd)
      }
    }).catch((err: BusinessError) => {
      console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
    })
  })

【总结】

需要保存或移动到系统文件目录file://docs/storage/Users/currentUser时,需要使用picker去保存文件。

更多关于HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢您的提问,目前问题正在处理中,


  • 处理状态:进行中

在HarmonyOS Next中遇到移动文件提示"源目标不存在"时,可能是以下原因导致:

  1. 文件路径包含特殊字符或空格
  2. 文件已被其他进程占用或锁定
  3. 路径拼写错误或大小写不匹配
  4. 文件系统权限限制

检查方法:

  1. 使用File API的access()方法验证文件存在性
  2. 确保使用绝对路径而非相对路径
  3. 检查文件是否被其他应用程序打开,

从截图来看,这个问题确实可能出在文件路径获取环节。在HarmonyOS Next中,访问应用沙箱外文件需要特别注意权限和路径转换:

  1. 首先确认源文件是否存在,建议先用fileio.access()检查文件可访问性
  2. 检查是否已申请ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限
  3. 使用getFileAccessHelper()获取文件访问帮助类来处理URI转换
  4. 移动文件前建议先复制文件,成功后再删除原文件

关键代码示例:

let fileAccessHelper = fileIo.getFileAccessHelper();
let srcFile = fileAccessHelper.openFile(srcUri, flags);
let destFile = fileAccessHelper.openFile(destUri, flags);
fileIo.copy(srcFile.fd, destFile.fd);
fileIo.unlink(srcUri);

注意URI格式是否正确,特别是从媒体库获取的URI需要转换为实际路径才能操作。

回到顶部