HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常
HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常
执行以上代码,将文件拷贝到沙盒下,但是2kb的文件,最后写到沙盒下变成3M了
resourcemanager拿到的fd不支持copyfile(所有rawfile被压缩在一块), 得用fs.read接口指定offset和length去读出来,然后再从buffer把东西写进最终文件
import fs from '@ohos.file.fs';
@Component
struct TestError {
@State message: string = 'Hello World'
@State rawfilePath:string = "config.txt";
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button(`将文件${this.rawfilePath}复制`)
.fontSize(16)
.fontWeight(FontWeight.Bold)
.margin(5)
.onClick(() => {
getContext(this).resourceManager.getRawFd(this.rawfilePath).then(file => {
this.copy2file(file)
}).catch(err => {
console.log(JSON.stringify(err));
})
})
}
.width('100%')
}
.height('100%')
}
async copy2file(item) {
try {
let dstPath = getContext(this).filesDir+'/test.txt'
this.saveFileToCache(item, dstPath)
} catch(e) {
console.log(`RawFile#copy2file() error : ${JSON.stringify(e)}`)
}
}
saveFileToCache(file, path) {
// 创建缓存文件(当前是覆盖式创建)
let cacheFile = fs.openSync(
path,
fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE | fs.OpenMode.TRUNC)
let buffer = new ArrayBuffer(4096);
let currentOffset = file.offset;
let lengthNeedToReed = file.length;
let readOption = {
offset: currentOffset,
length: lengthNeedToReed > buffer.byteLength ? 4096 : lengthNeedToReed
}
while(true) {
// 读取buffer容量的内容
let readLength = fs.readSync(file.fd, buffer, readOption);
// 写入buffer容量的内容
fs.writeSync(cacheFile.fd, buffer, {length:readLength})
// 判断后续内容 修改读文件的参数
if (readLength < 4096) {
break;
}
lengthNeedToReed -= readLength;
readOption.offset += readLength;
readOption.length = lengthNeedToReed > buffer.byteLength ? 4096 : lengthNeedToReed;
}
fs.close(cacheFile);
}
参考链接
更多关于HarmonyOS鸿蒙Next中资源文件拷贝到设备沙盒下异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
感谢,不过后面改成将文件放在resfile文件夹,直接用getContext().resourceDir+"/文件名"
来获取到文件在沙盒下的路径了。
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
已解决。
改成将文件放在resfile文件夹,直接用getContext().resourceDir+"/文件名"
来获取到文件在沙盒下的路径了
在HarmonyOS鸿蒙Next中,资源文件拷贝到设备沙盒下异常可能由以下原因导致:
-
权限问题:确保应用已申请并获取了必要的文件读写权限,如
ohos.permission.READ_MEDIA
和ohos.permission.WRITE_MEDIA
。 -
路径错误:检查拷贝的目标路径是否正确,确保路径指向设备的沙盒目录,如
/data/storage/el2/base/
。 -
文件系统限制:某些文件可能被系统保护或锁定,导致无法拷贝。确保文件未被其他进程占用或锁定。
-
存储空间不足:检查设备存储空间是否足够,确保有足够的空间进行文件拷贝。
-
API调用错误:确认使用的API是否正确,如
FileManager
或File
类的方法。
建议逐步排查以上问题,或查看系统日志获取更详细的错误信息。