HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决
HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决
【问题现象】
使用resourceManager.getRawFd
获取rawfile
目录下资源文件描述符fd
,再使用fileIo.copyfile
拷贝到沙箱目录后,文件大小及内容都异常。
代码示例如下:
copyRawFileToSdcard(context: common.Context) {
let destRoot = context.filesDir;
let srcFileName = "test_1.txt" // rawFile下的文件名
let destFilePath = destRoot + "/test/copy_" + srcFileName;
console.log("copyRawFileToSdcard filepath : " + destFilePath)
// 创建文件目录
fileIo.mkdir(destRoot + "/test").catch((exp: Error) => {
// 可能目录已存在或者没有权限
console.log("copyRawFileToSdcard mkdir fail : " + JSON.stringify(exp))
}).then(async () => {
// 创建目录成功
console.log("copyRawFileToSdcard mkdir success ")
// 获取rawFile的fd
let data: resourceManager.RawFileDescriptor = await context.resourceManager.getRawFd(srcFileName);
fileIo.copyFile(data.fd, destFilePath, 0).catch((exp: Error) => {
// 文件拷贝失败
console.log("copyRawFileToSdcard write exception " + JSON.stringify(exp))
}).then(() => {
// 文件拷贝成功
console.log("copyRawFileToSdcard write success")
})
})
}
原始文件与拷贝后文件对比如下:
【背景知识】
- rawfile目录属于应用工程的资源目录,该目录下的文件目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。可以通过指定文件路径和文件名访问。
- 可以通过resourceManager.getRawFileContent获取
rawfile
目录下的文件内容。
【定位思路】
rawfile
目录下文件属于应用工程的资源文件,获取的resourceManager.RawFileDescriptor
中的资源fd
并非文件系统的文件描述符fd
,不能直接通过Core File Kit(文件基础服务)去访问和管理,需要通过@ohos.resourceManager (资源管理)模块访问。
【解决方案】
- 使用
resourceManager.getRawFileContent
获取rawfile
目录下文件内容; - 使用
fileIo.createStreamSync
获取目标文件流fileStream
,再使用fileStream.writeSync
写入。
代码示例如下:
copyRawFileToSdcard(context: common.Context) {
let destRoot = context.filesDir;
let srcFileName = "test_1.txt" // rawFile下的文件名
let destFilePath = destRoot + "/test/copy_" + srcFileName;
console.log("copyRawFileToSdcard filepath : " + destFilePath)
// 创建文件目录
fileIo.mkdir(destRoot + "/test").catch((exp: Error) => {
// 可能目录已存在或者没有权限
console.log("copyRawFileToSdcard mkdir fail : " + JSON.stringify(exp))
}).then(async () => {
// 创建目录成功
console.log("copyRawFileToSdcard mkdir success ")
context.resourceManager.getRawFileContent(srcFileName, (error: BusinessError, value: Uint8Array) => {
if (error != null) {
console.error("error is " + error);
} else {
let rawFile = value;
let fileStream = fileIo.createStreamSync(destFilePath, "w+");
fileStream.writeSync(rawFile.buffer);
fileStream.close();
// 文件拷贝成功
console.log("copyRawFileToSdcard write success")
}
});
})
.catch((exp: Error) => {
// 文件拷贝失败
console.log("copyRawFileToSdcard write exception " + JSON.stringify(exp))
})
}
最终的文件对比完全相同:
【总结】
- 使用
resourceManager.getRawFd
获取rawfile
目录下资源文件描述符fd
,并非文件管理系统中的文件描述符fd
,两者指向的并非同一文件。 rawFile
目录下的文件拷贝需要使用resourceManager.getRawFileContent
获取其文件内容,再写入到对应文件中。
更多关于HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中rawfile下文件拷贝到沙箱后大小和内容错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,rawfile目录下的文件拷贝到沙箱后出现大小和内容错误可能是由于文件路径或读取方式不当导致的。确保使用正确的API进行文件拷贝,如使用ResourceManager
的getRawFile
方法获取文件资源,再使用File
或FileOutputStream
进行写入操作。
检查文件路径是否正确,确保目标路径在沙箱内。如果文件较大,可能需要分块读取和写入,避免一次性操作导致内存溢出或数据丢失。另外,确认文件编码格式是否一致,防止因编码问题导致内容错误。