HarmonyOs如何获取rawfile目录下的所有文件列表

最近在做一个功能,需要使用获取rawfile下目录的所有文件

参考连接为: 



zRawfile-模块-C API-Localization Kit(本地化开发服务)-应用框架 - 华为HarmonyOS开发者 (huawei.com)

需要使用到native实现,实现步骤:

以ArkTS侧获取rawfile文件列表、rawfile文件内容、rawfile描述符{fd, offset, length}三种调用方式为例。

2. 添加依赖

创建完成后,IDE会在工程生成cpp目录,目录有libentry/index.d.ts、hello.cpp、CMakeLists.txt等文件。

  1. 打开src/main/cpp/CMakeLists.txt,在target_link_libraries依赖中添加资源的librawfile.z.so以及日志依赖libhilog_ndk.z.so。
    target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so)
    
  2. 打开src/main/cpp/types/libentry/index.d.ts文件,此文件声明了应用侧函数getFileList、getRawFileContent、getRawFileDescriptor。
    import resourceManager from '@ohos.resourceManager';
    export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array<String>;
    export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array;
    export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor;
    export const isRawDir: (resmgr: resourceManager.ResourceManager, path: string) => Boolean;
    

3. 修改源文件

打开src/main/cpp/hello.cpp文件,文件Init会对当前方法进行初始化映射,这里定义对外接口为getFileList、getRawFileContent、getRawFileDescriptor,映射C++接口分别为GetFileList、GetRawFileContent、GetRawFileDescriptor。

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{napi_property_descriptor desc[] = {{ "getFileList", nullptr, GetFileList, nullptr, nullptr, nullptr, napi_default, nullptr },{ "getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr },{ "getRawFileDescriptor", nullptr, GetRawFileDescriptor, nullptr, nullptr, nullptr, napi_default, nullptr },{ "isRawDir", nullptr, IsRawDir, nullptr, nullptr, nullptr, napi_default, nullptr }};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
}
EXTERN_C_END

把src/main/cpp/hello.cpp文件中,增加对应的三个方法,如下所示

static napi_value GetFileList(napi_env env, napi_callback_info info)
static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
static napi_value IsRawDir(napi_env env, napi_callback_info info)

 在hello.cpp文件中获取Js的资源对象,并转为Native的资源对象,即可调用资源的Native接口,获取rawfile列表、rawfile文件内容以及rawfile描述符{fd, offset, length}三种调用方式示例代码如下:

#include <rawfile/raw_file.h>
#include <rawfile/raw_dir.h>
#include <rawfile/raw_file_manager.h>// 示例一:获取rawfile文件列表 GetFileList
static napi_value GetFileList(napi_env env, napi_callback_info info)
{OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin");size_t requireArgc = 3;size_t argc = 2;napi_value argv[2] = { nullptr };// 获取参数信息napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);// argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);// 获取函数argv[1],此为为rawfile相对路径size_t strSize;char strBuf[256];napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);std::string dirName(strBuf, strSize);// 获取对应的rawDir指针对象RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str());// 获取rawDir下文件及文件夹数量int count = OH_ResourceManager_GetRawFileCount(rawDir);// 遍历获取文件名称,并保存std::vector<std::string> tempArray;for(int i = 0; i < count; i++) {std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i);tempArray.emplace_back(filename);}napi_value fileList;napi_create_array(env, &fileList);for (size_t i = 0; i < tempArray.size(); i++) {napi_value jsString;napi_create_string_utf8(env, tempArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString);napi_set_element(env, fileList, i, jsString);}// 关闭打开的指针对象OH_ResourceManager_CloseRawDir(rawDir);OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);return fileList;
}// 示例二:获取rawfile文件内容 GetRawFileContent
napi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length)
{napi_value buffer;napi_status status = napi_create_external_arraybuffer(env, data.get(), length,[](napi_env env, void *data, void *hint) {delete[] static_cast<char*>(data);}, nullptr, &buffer);if (status != napi_ok) {OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer");return nullptr;}napi_value result = nullptr;status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result);if (status != napi_ok) {OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create media typed array");return nullptr;}data.release();return result;
}
static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
{OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin");size_t requireArgc = 3;size_t argc = 2;napi_value argv[2] = { nullptr };// 获取参数信息napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);// argv[0]即为函数第一个参数Js资源对象,OH_ResourceManager_InitNativeResourceManager转为Native对象。NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);size_t strSize;char strBuf[256];napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);std::string filename(strBuf, strSize);// 获取rawfile指针对象RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());if (rawFile != nullptr) {OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");}// 获取rawfile大小并申请内存long len = OH_ResourceManager_GetRawFileSize(rawFile);std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);// 一次性读取rawfile全部内容int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);// 多次部分读取rawfile, 每次读取100 Byte。获取全部内容// long offset = 0;// while (OH_ResourceManager_GetRawFileRemainingLength(rawFile) > 0) {//     OH_ResourceManager_ReadRawFile(rawFile, data.get() + offset, 100);//     offset += 100;// }// 关闭打开的指针对象OH_ResourceManager_CloseRawFile(rawFile);OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);// 转为js对象return CreateJsArrayValue(env, data, len);
}// 示例三:获取rawfile文件描述符 GetRawFileDescriptor
napi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor)
{napi_value result;napi_status status = napi_create_object(env, &result);if (status != napi_ok) {return result;}napi_value fd;status = napi_create_int32(env, descriptor.fd, &fd);if (status != napi_ok) {return result;}status = napi_set_named_property(env, result, "fd", fd);if (status != napi_ok) {return result;}napi_value offset;status = napi_create_int64(env, descriptor.start, &offset);if (status != napi_ok) {return result;}status = napi_set_named_property(env, result, "offset", offset);if (status != napi_ok) {return result;}napi_value length;status = napi_create_int64(env, descriptor.length, &length);if (status != napi_ok) {return result;}status = napi_set_named_property(env, result, "length", length);if (status != napi_ok) {return result;}return result;
}
static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
{OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin");size_t requireArgc = 3;size_t argc = 2;napi_value argv[2] = { nullptr };// 获取参数信息napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);napi_valuetype valueType;napi_typeof(env, argv[0], &valueType);// 获取native的resourceManager对象NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);size_t strSize;char strBuf[256];napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);std::string filename(strBuf, strSize);// 获取rawfile指针对象RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());if (rawFile != nullptr) {OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");}// 获取rawfile的描述符RawFileDescriptor {fd, offset, length}RawFileDescriptor descriptor;OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);// 关闭打开的指针对象OH_ResourceManager_CloseRawFile(rawFile);OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);// 转为js对象return createJsFileDescriptor(env,descriptor);
}
napi_value CreateJsBool(napi_env env, bool &bValue)
{napi_value jsValue = nullptr;if (napi_get_boolean(env, bValue, &jsValue) != napi_ok) {return nullptr;}return jsValue;
}
static napi_value IsRawDir(napi_env env, napi_callback_info info)
{OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest IsRawDir Begin");size_t requireArgc = 3;size_t argc = 2;napi_value argv[2] = { nullptr };// 获取参数信息napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);napi_valuetype valueType;napi_typeof(env, argv[0], &valueType);// 获取native的resourceManager对象NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);napi_valuetype valueType1;napi_typeof(env, argv[1], &valueType);if (valueType1 == napi_undefined || valueType1 == napi_null) {bool temp = false;return CreateJsBool(env, temp);}size_t strSize;char strBuf[256];napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);std::string filename(strBuf, strSize);// 获取rawfile指针对象bool result = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);return CreateJsBool(env, result);
}

 Js侧调用

  1. 打开src\main\ets\pages\index.ets, 导入"libentry.so";

  2. 资源获取包括获取本应用包资源、应用内跨包资源、跨应用包资源。

获取本应用包resourceManager对象,通过.context().resourceManager方法。

获取应用内跨包resourceManager对象,通过.context().createModuleContext().resourceManager 方法。

获取跨应用包resourceManager对象,通过.context.createModuleContext(bundleName:‘bundleName name’,moduleName:‘module name’).resourceManager方法,该方法仅支持系统应用使用。

Context的更多使用信息请参考 应用上下文Context 。调用Native接口getFileList即为src/main/cpp/types/libentry/index.d.ts中声明的接口,传入js的资源对象,以及rawfile文件夹的相对路径。
获取本应用包资源resourceManager对象的示例如下:

导入:import testNapi from 'libentry.so';  
private resmgr = getContext().resourceManager;
aboutToAppear(): void {let rawfilelist = testNapi.getFileList(this.resmgr, "midi"); //传入资源对象,以及访问的rawfile文件夹名称console.log("rawfilelist" + rawfilelist);}

 打印如下:

rawfile目录:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2008-2020年 中国健康与养老追踪调查CHARLS数据合集

中国健康与养老追踪调查&#xff08;China Health and Retirement Longitudinal Study, CHARLS&#xff09;是一项由北京大学国家发展研究院主持的大型跨学科调查项目。该项目始于2011年&#xff0c;每两到三年对样本进行一次追踪调查&#xff0c;旨在收集代表中国45岁及以上中…

面试经典算法150题系列-反转字符串中的单词

反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能…

关于告警,要想做好,从这些方面着手

各类监控系统都会产生告警事件&#xff0c;于是&#xff0c;就产生了 FlashDuty、PagerDuty、Opsgenie 这类产品&#xff0c;做告警事件的收敛降噪、排班认领升级等。如果你想增强自己公司的告警事件处理能力&#xff0c;参考&#xff08;chao xi&#xff09;这些产品的功能就可…

使用统计方法在AMD GPU上使用JAX Profiler可靠地比较大型生成AI模型中的算法性能

Using statistical methods to reliably compare algorithm performance in large generative AI models with JAX Profiler on AMD GPUs — ROCm Blogs 摘要 本文提供了一份详细的指南&#xff0c;介绍如何在JAX实现的生成AI模型中测量和比较各种算法的性能。利用JAX Profiler…

35岁程序员的4条出路!请提早布局!

小编准备入门了Python入门学习籽料80个Python爬虫实战入门实例 点击 领取&#xff08;无偿获得&#xff09; 20多岁&#xff0c;初入职场&#xff0c;满腔热血&#xff0c;对未来充满憧憬&#xff1b; 30多岁&#xff0c;家庭事业双重压力&#xff0c;开始迷茫&#xff0c;对…

阿里云发送短信功能(Java)

&#xff08;1&#xff09;注册用户&#xff0c;并且开通短信套餐 &#xff08;2&#xff09; 点击快速学习&#xff0c;然后绑定测试的手机号码。 选用专用测试签名&#xff08;自定义的话阿里可能会验证什么什么的比较麻烦&#xff09; 然后在选取调用API &#xff08;3&…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的&#xff1f; 就在刚刚它又全面升级了 新版无需安装&#xff0c;直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Git实战精粹

一、快速入门 1. 什么是Git Git是一个分布式的版本控制软件。 软件&#xff0c;类似于QQ、office、dota等安装到电脑上才能使用的工具版本控制&#xff0c;类似于毕业论文、写文案、视频剪辑等&#xff0c;需要反复修改和保留原历史数据分布式 文件夹拷贝本地版本控制集中式…

如何在Java中使用protobuf

写在前面 本文看下在Java中如何使用protofbuf。 1&#xff1a;介绍 1.1&#xff1a;什么是protobuf 是一种数据格式&#xff0c;同json&#xff0c;xml&#xff0c;等。但是一种二进制数据格式。 1.2&#xff1a;强在哪里&#xff1f;为啥要用&#xff1f; 小&#xff0c…

JS中this的指向问题、JS的执行机制、offset、client、scroll

JS中this的指向问题 1. 在全局环境下 在全局环境中&#xff08;在浏览器中是 window 对象&#xff0c;在Node.js中是 global 对象&#xff09;&#xff0c;this 指向全局对象。 console.log(this window); // 在浏览器中为 true console.log(this.document ! undefined); //…

如何练高音技巧

如何练高音技巧 高音的练习技巧有&#xff1a;练“a”(啊)音&#xff0c;让口腔打开&#xff0c;声带放松&#xff0c;反复几次&#xff1b;再练“u”(呜)音&#xff0c;这个音可以有按摩声带的功能&#xff0c;也使声带进一步放松&#xff1b;发“i”(衣)音&#xff0c;逐步加…

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s概述 2、Service在Kubernetes中的…

大模型本地化部署2-Docker部署MaxKB

大模型本地化部署2-Docker部署MaxKB 0、MaxKB简介1、安装docker2、在docker中拉取MaxKB镜像3、运行镜像4、访问MaxKB5、创建应用6、使用应用进行对话 0、MaxKB简介 MaxKB是一款基于LLM大预言模型的知识库问答系统。具有以下特点&#xff1a; 多模型支持&#xff1a;支持对接主…

开放式耳机怎么戴?佩戴舒适在线的几款开放式耳机分享

开放式耳机的佩戴方式与传统的入耳式耳机有所不同&#xff0c;它采用了一种挂耳式的设计&#xff0c;提供了一种新颖的佩戴体验&#xff0c;以下是开放式耳机的佩戴方式。 1. 开箱及外观&#xff1a;首先&#xff0c;从包装盒中取出耳机及其配件&#xff0c;包括耳机本体、充电…

什么是密码学?

什么是密码学&#xff1f; 密码学是一种通过使用编码算法、哈希和签名来保护信息的实践。此信息可以处于静态&#xff08;例如硬盘驱动器上的文件&#xff09;、传输中&#xff08;例如两方或多方之间交换的电子通信&#xff09;或使用中&#xff08;在对数据进行计算时&#…

设计模式-结构性模式-桥接模式

1.桥接模式定义 桥接模式就是将抽象部分与他的实现部分分离&#xff0c;使他们都可以独立的变化&#xff1b; 桥接模式用一种巧妙地方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c;将类之间的静态继承关系转变为动态的组合关系&#xff0c;…

Leetcode JAVA刷刷站(99)恢复二叉搜索树

一、题目概述 二、思路方向 要解决这个问题&#xff0c;我们可以采用中序遍历二叉搜索树&#xff08;BST&#xff09;的方法&#xff0c;因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了&#xff0c;所以中序遍历的结果中将有两个位置上的元素是逆序的。…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 I…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…