HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在
HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在
我想把备份的数据库拷贝到指定路径,在执行moveFile
函数的时候一直说源路径不在,是不是我数据库备份路径那一步获取可访问URL有问题啊
更多关于HarmonyOS 鸿蒙Next中移动文件的时候一直说源目标不存在的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【背景知识】
- 关系型数据库:ArkTS关系型数据库基于SQLite实现,为应用提供数据持久化能力。
- fs.moveFile:将源文件移动至目标目录当中。
- 保存文件至公共目录:将文件保存至设备公共目录当中。
【问题定位】
根据截图代码,可以复现问题。更改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中遇到移动文件提示"源目标不存在"时,可能是以下原因导致:
- 文件路径包含特殊字符或空格
- 文件已被其他进程占用或锁定
- 路径拼写错误或大小写不匹配
- 文件系统权限限制
检查方法:
- 使用File API的access()方法验证文件存在性
- 确保使用绝对路径而非相对路径
- 检查文件是否被其他应用程序打开,
从截图来看,这个问题确实可能出在文件路径获取环节。在HarmonyOS Next中,访问应用沙箱外文件需要特别注意权限和路径转换:
- 首先确认源文件是否存在,建议先用fileio.access()检查文件可访问性
- 检查是否已申请
ohos.permission.READ_MEDIA
和ohos.permission.WRITE_MEDIA
权限 - 使用getFileAccessHelper()获取文件访问帮助类来处理URI转换
- 移动文件前建议先复制文件,成功后再删除原文件
关键代码示例:
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需要转换为实际路径才能操作。