HarmonyOS 鸿蒙Next:音频文件放在resouces的rawfile下面,fs.open(path, fs.OpenMode.READ_ONLY) 总是报文件或目录不存在的错误,怎么办?

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:音频文件放在resouces的rawfile下面,fs.open(path, fs.OpenMode.READ_ONLY) 总是报文件或目录不存在的错误,怎么办?

let context = getContext(this) as common.UIAbilityContext;
let pathDir = context.filesDir;
let path = pathDir + ‘/click_sound.mp3’;
await fs.open(path, fs.OpenMode.READ_ONLY).then((file: fs.File) => {
console.info("file fd: " + file.fd);
uri = ‘fd://’ + (file.fd).toString()
}).catch((err: BusinessError) => {
console.error('soundPool load failed and catch error is ’ + err.message);
});

音频文件放在resouces的rawfile下面,fs.open(path, fs.OpenMode.READ_ONLY) 总是报文件或者目录不存在的错误,怎么办?

6 回复
问题解决了吗

试一下如下写法

//转换成数组
let array = getContext().resourceManager.getRawFileContentSync("a.mp3");
//获取沙箱路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
//组装存储临时路径
let finalPath = filesDir + "a.mp3";
//创建文件
let file: fs.File = fs.openSync(finalPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
//写入文件
fs.writeSync(file.fd, array.buffer);
fs.closeSync(file);
//转换地址
let uri = fileUri.getUriFromPath(finalPath);

怎么感觉不是回答同一个问题,一个是打开文件报错不存在。 看您的代码是把文件复制出来写入到一个新的文件?

fs.open需要的是rawFile的路径,而目前无法直接获取到rawFile的path,所以解决思路是将文件获取到fd或者是Uint8Array数组然后保存新文件打开

鸿蒙不支持直接获取路径的方法?牛逼,开发人员不做应用的,这个不应该在做这个的时候就支持吗?难道有技术难度? 有些东西鸿蒙没有实现真的是不能理解,因为说难也没技术难度,说不需要吧,也是必须的功能。但就是不做。 这样的东西Android很成熟了呀,直接抄不就行了。 不支持获取rawFile,就先不要提供这个功能,提供了,起码基础的还是要实现下。 比如您这个获取array,万一这个文件几十M或者是几个G,那内存问题怎么办?

在HarmonyOS开发中,如果你尝试使用fs.open(path, fs.OpenMode.READ_ONLY)访问resources/rawfile目录下的音频文件,但遇到“文件或目录不存在”的错误,这通常是因为资源文件的路径处理不正确。

首先,确保你的音频文件确实位于resources/rawfile目录下,并且该目录在项目的资源结构中正确设置。在HarmonyOS中,resources/rawfile通常用于存放不需要编译的原始文件,但直接通过文件系统API访问这些文件可能不受支持,因为这些资源文件在打包应用时可能不直接映射到设备的文件系统中。

一种常见的解决方案是使用ResourceManager类来访问这些资源文件。你可以通过ResourceManager.getRawResource()方法来获取资源的InputStream,然后读取文件内容。例如:

try (InputStream is = getResourceManager().getRawResource(resourceId)) {
    // 使用is来读取文件内容
} catch (IOException e) {
    e.printStackTrace();
}

其中resourceId是资源文件中定义的标识符,通常在resources.xml中定义。

如果你坚持使用文件系统API,请检查你的path变量是否正确构建,确保它符合HarmonyOS文件系统的路径规范。同时,考虑应用是否有足够的权限去访问指定的路径。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部