• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Raw File Development
2
3## When to Use
4
5This document describes how to use native RawFile APIs to manage raw file directories and files in OpenHarmony. You can use the APIs to perform operations such as traversing a file list and opening, searching for, reading, and closing raw files.
6The APIs ended with **64** are new APIs. These APIs can be used to open raw files larger than 2 GB. For details, see [Rawfile](../reference/apis-localization-kit/rawfile.md). The development procedure is the same for the API ended with **64** and the one does not. For example, you can use **OH_ResourceManager_OpenRawFile** and **OH_ResourceManager_OpenRawFile64** in the same way.
7
8## Available APIs
9
10| API                                                      | Description                                    |
11| :----------------------------------------------------------- | :--------------------------------------- |
12| NativeResourceManager *OH_ResourceManager_InitNativeResourceManager(napi_env env, napi_value jsResMgr) | Initializes the native resource manager.         |
13| RawDir *OH_ResourceManager_OpenRawDir(const NativeResourceManager *mgr, const char *dirName) | Opens a raw file directory.                   |
14| int OH_ResourceManager_GetRawFileCount(RawDir *rawDir)       | Obtains the number of raw files in a directory.|
15| const char *OH_ResourceManager_GetRawFileName(RawDir *rawDir, int index) | Obtains the name of a raw file.                       |
16| RawFile *OH_ResourceManager_OpenRawFile(const NativeResourceManager *mgr, const char *fileName) | Opens a raw file.                   |
17| long OH_ResourceManager_GetRawFileSize(RawFile *rawFile)     | Obtains the size of a raw file.                   |
18| int OH_ResourceManager_SeekRawFile(const RawFile *rawFile, long offset, int whence) | Seeks a read/write position in a raw file based on the specified offset.                   |
19| long OH_ResourceManager_GetRawFileOffset(const RawFile *rawFile) | Obtains the offset of a raw file.                     |
20| int OH_ResourceManager_ReadRawFile(const RawFile *rawFile, void *buf, size_t length) | Reads a raw file.                   |
21| int64_t OH_ResourceManager_GetRawFileRemainingLength(const RawFile *rawFile) | Obtains the remaining length of a raw file.                   |
22| void OH_ResourceManager_CloseRawFile(RawFile *rawFile)       | Closes a raw file to release resources.               |
23| void OH_ResourceManager_CloseRawDir(RawDir *rawDir)          | Closes a raw file directory to release resources.               |
24| bool OH_ResourceManager_GetRawFileDescriptor(const RawFile *rawFile, RawFileDescriptor &descriptor) | Obtains the file descriptor (FD) of a raw file.                       |
25| bool OH_ResourceManager_ReleaseRawFileDescriptor(const RawFileDescriptor &descriptor) | Releases the FD of a raw file.                       |
26| void OH_ResourceManager_ReleaseNativeResourceManager(NativeResourceManager *resMgr) | Releases the native resource manager.   |
27| bool OH_ResourceManager_IsRawDir(const NativeResourceManager *mgr, const char *path) | Checks whether a path is a subdirectory in the **rawfile** directory.   |
28
29For details about the APIs, see [Function Description](../reference/apis-localization-kit/rawfile.md#function-description).
30
31## How to Develop
32
33The following describes how to obtain the raw file list, raw file content, and raw file descriptor{fd, offset, length} using ArkTS as an example.
34
351. Create a project on DevEco Studio.
36
37   ![Creating a C++ application](figures/rawfile1.png)
38
392. Add dependencies.
40
41   After the project is created, the **cpp** directory is created in the project directory. In the **cpp** directory, there are files such as **libentry/index.d.ts**, **hello.cpp**, and **CMakeLists.txt**.
42
43   1. Open the **src/main/cpp/CMakeLists.txt** file, and add **librawfile.z.so** and **libhilog_ndk.z.so** to **target_link_libraries**.
44
45       ```c++
46       target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so)
47       ```
48
49   2. Open the **src/main/cpp/types/libentry/index.d.ts** file, and declare the application functions **getFileList**, **getRawFileContent**, and **getRawFileDescriptor**.
50
51   ```c++
52   import resourceManager from '@ohos.resourceManager';
53   export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array<String>;
54   export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array;
55   export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor;
56   export const isRawDir: (resmgr: resourceManager.ResourceManager, path: string) => Boolean;
57   ```
58
593. Modify the source file.
60
61   1. Open the **src/main/cpp/hello.cpp** file. During initialization, the file maps the external JavaScript (JS) APIs **getFileList**, **getRawFileContent**, and **getRawFileDescriptor** to C++ native APIs **GetFileList**, **GetRawFileContent**, and **GetRawFileDescriptor**.
62
63       ```c++
64       EXTERN_C_START
65       static napi_value Init(napi_env env, napi_value exports)
66       {
67           napi_property_descriptor desc[] = {
68               { "getFileList", nullptr, GetFileList, nullptr, nullptr, nullptr, napi_default, nullptr },
69               { "getRawFileContent", nullptr, GetRawFileContent, nullptr, nullptr, nullptr, napi_default, nullptr },
70               { "getRawFileDescriptor", nullptr, GetRawFileDescriptor, nullptr, nullptr, nullptr, napi_default, nullptr },
71               { "isRawDir", nullptr, IsRawDir, nullptr, nullptr, nullptr, napi_default, nullptr }
72           };
73
74           napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
75           return exports;
76       }
77       EXTERN_C_END
78       ```
79
80   2. Add the three C++ native APIs to the **src/main/cpp/hello.cpp** file.
81
82       ```c++
83       static napi_value GetFileList(napi_env env, napi_callback_info info)
84       static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
85       static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
86       static napi_value IsRawDir(napi_env env, napi_callback_info info)
87       ```
88
89   3. Obtain JS resource objects from the **hello.cpp** file, and convert them to native resource objects. Then, call the native APIs to obtain the raw file list, raw file content, and raw file descriptor {fd, offset, length}. The sample code is as follows:
90
91       ```c++
92       #include <rawfile/raw_file.h>
93       #include <rawfile/raw_dir.h>
94       #include <rawfile/raw_file_manager.h>
95
96       // Example 1: Use GetFileList to obtain the raw file list.
97       static napi_value GetFileList(napi_env env, napi_callback_info info)
98       {
99           OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest Begin");
100           size_t requireArgc = 3;
101           size_t argc = 2;
102           napi_value argv[2] = { nullptr };
103           // Obtain arguments of the native API.
104           napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
105
106           // argv[0] is the first parameter of the function, which is a JS resource object. The function OH_ResourceManager_InitNativeResourceManager converts this JS resource object into a native object.
107           NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
108
109           // Obtain argv[1], which specifies the relative path of the raw file.
110           size_t strSize;
111           char strBuf[256];
112           napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
113           std::string dirName(strBuf, strSize);
114
115           // Obtain the corresponding rawDir pointer object.
116           RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str());
117
118           // Obtain the number of files and folders in rawDir.
119           int count = OH_ResourceManager_GetRawFileCount(rawDir);
120
121           // Traverse rawDir to obtain the list of file names and save it.
122           std::vector<std::string> tempArray;
123           for(int i = 0; i < count; i++) {
124               std::string filename = OH_ResourceManager_GetRawFileName(rawDir, i);
125               tempArray.emplace_back(filename);
126           }
127
128           napi_value fileList;
129           napi_create_array(env, &fileList);
130           for (size_t i = 0; i < tempArray.size(); i++) {
131               napi_value jsString;
132               napi_create_string_utf8(env, tempArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString);
133               napi_set_element(env, fileList, i, jsString);
134           }
135
136           // Close the rawDir pointer object.
137           OH_ResourceManager_CloseRawDir(rawDir);
138           OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
139           return fileList;
140       }
141
142       // Example 2: Use GetRawFileContent to obtain the content of the raw file.
143       napi_value CreateJsArrayValue(napi_env env, std::unique_ptr<uint8_t[]> &data, long length)
144       {
145           napi_value buffer;
146           napi_status status = napi_create_external_arraybuffer(env, data.get(), length,
147                   [](napi_env env, void *data, void *hint) {
148                       delete[] static_cast<char*>(data);
149                   }, nullptr, &buffer);
150           if (status != napi_ok) {
151               OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create external array buffer");
152               return nullptr;
153           }
154           napi_value result = nullptr;
155           status = napi_create_typedarray(env, napi_uint8_array, length, buffer, 0, &result);
156           if (status != napi_ok) {
157               OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "Failed to create media typed array");
158               return nullptr;
159           }
160           data.release();
161           return result;
162       }
163       static napi_value GetRawFileContent(napi_env env, napi_callback_info info)
164       {
165           OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "GetFileContent Begin");
166           size_t requireArgc = 3;
167           size_t argc = 2;
168           napi_value argv[2] = { nullptr };
169           // Obtain arguments of the native API.
170           napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
171
172           // argv[0] is the first parameter of the function, which is a JS resource object. The function OH_ResourceManager_InitNativeResourceManager converts this JS resource object into a native object.
173           NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
174           size_t strSize;
175           char strBuf[256];
176           napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
177           std::string filename(strBuf, strSize);
178
179           // Obtain the raw file pointer object.
180           RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
181           if (rawFile != nullptr) {
182               OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
183           }
184           // Obtain the size of the raw file and apply for memory.
185           long len = OH_ResourceManager_GetRawFileSize(rawFile);
186           std::unique_ptr<uint8_t[]> data= std::make_unique<uint8_t[]>(len);
187
188           // Read all content of the raw file at a time.
189           int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len);
190
191           // Read all content of the raw file by multiple times, with 100 bytes per time.
192           // long offset = 0;
193           // while (OH_ResourceManager_GetRawFileRemainingLength(rawFile) > 0) {
194           //     OH_ResourceManager_ReadRawFile(rawFile, data.get() + offset, 100);
195           //     offset += 100;
196           // }
197
198           // Close the rawDir pointer object.
199           OH_ResourceManager_CloseRawFile(rawFile);
200           OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
201           // Convert the native object to a JS object.
202           return CreateJsArrayValue(env, data, len);
203       }
204
205       // Example 3: Use GetRawFileDescriptor to obtain the FD of the raw file.
206       napi_value createJsFileDescriptor(napi_env env, RawFileDescriptor &descriptor)
207       {
208           napi_value result;
209           napi_status status = napi_create_object(env, &result);
210           if (status != napi_ok) {
211               return result;
212           }
213
214           napi_value fd;
215           status = napi_create_int32(env, descriptor.fd, &fd);
216           if (status != napi_ok) {
217               return result;
218           }
219           status = napi_set_named_property(env, result, "fd", fd);
220           if (status != napi_ok) {
221               return result;
222           }
223
224           napi_value offset;
225           status = napi_create_int64(env, descriptor.start, &offset);
226           if (status != napi_ok) {
227               return result;
228           }
229           status = napi_set_named_property(env, result, "offset", offset);
230           if (status != napi_ok) {
231               return result;
232           }
233
234           napi_value length;
235           status = napi_create_int64(env, descriptor.length, &length);
236           if (status != napi_ok) {
237               return result;
238           }
239           status = napi_set_named_property(env, result, "length", length);
240           if (status != napi_ok) {
241               return result;
242           }
243           return result;
244       }
245       static napi_value GetRawFileDescriptor(napi_env env, napi_callback_info info)
246       {
247           OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest GetRawFileDescriptor Begin");
248           size_t requireArgc = 3;
249           size_t argc = 2;
250           napi_value argv[2] = { nullptr };
251           // Obtain arguments of the native API.
252           napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
253
254           napi_valuetype valueType;
255           napi_typeof(env, argv[0], &valueType);
256             // Obtain the native resource manager object.
257           NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
258           size_t strSize;
259           char strBuf[256];
260           napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
261           std::string filename(strBuf, strSize);
262           // Obtain the raw file pointer object.
263           RawFile *rawFile = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
264           if (rawFile != nullptr) {
265               OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "OH_ResourceManager_OpenRawFile success");
266           }
267           // Obtain the FD of the raw file, that is, RawFileDescriptor {fd, offset, length}.
268           RawFileDescriptor descriptor;
269           OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor);
270           // Close the rawDir pointer object.
271           OH_ResourceManager_CloseRawFile(rawFile);
272           OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
273           // Convert the native object to a JS object.
274           return createJsFileDescriptor(env,descriptor);
275       }
276       napi_value CreateJsBool(napi_env env, bool &bValue)
277       {
278           napi_value jsValue = nullptr;
279           if (napi_get_boolean(env, bValue, &jsValue) != napi_ok) {
280               return nullptr;
281           }
282           return jsValue;
283       }
284       static napi_value IsRawDir(napi_env env, napi_callback_info info)
285       {
286           OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, tag, "NDKTest IsRawDir Begin");
287           size_t requireArgc = 3;
288           size_t argc = 2;
289           napi_value argv[2] = { nullptr };
290           // Obtain arguments of the native API.
291           napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
292
293           napi_valuetype valueType;
294           napi_typeof(env, argv[0], &valueType);
295           // Obtain the native resource manager.
296           NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
297
298           napi_valuetype valueType1;
299           napi_typeof(env, argv[1], &valueType);
300           if (valueType1 == napi_undefined || valueType1 == napi_null) {
301               bool temp = false;
302               return CreateJsBool(env, temp);
303           }
304           size_t strSize;
305           char strBuf[256];
306           napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
307           std::string filename(strBuf, strSize);
308           // Obtain the raw file pointer object.
309           bool result = OH_ResourceManager_OpenRawFile(mNativeResMgr, filename.c_str());
310           OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);
311           return CreateJsBool(env, result);
312       }
313       ```
314
3154. Call JS APIs.
316
317   1. Open **src\main\ets\pages\index.ets**, and import **libentry.so**.
318
319   2. Obtain intra-package resources and cross-package resources within an application and cross-application package resources.
320
321      Call **.context().resourceManager** to obtain a **resourceManager** object for intra-package resources within the application.<br>Call **.context().createModuleContext().resourceManager** to obtain a **resourceManager** object for cross-package resources within the application.<br>Call **.context.createModuleContext(bundleName:'bundleName name',moduleName:'module name').resourceManager** to obtain a **resourceManager** object for cross-application package resources. This API can be used only by system applications.
322
323      For details about **Context**, see [Context (Stage Model)](../application-models/application-context-stage.md).
324
325   3. Call **getFileList**, that is, the native API declared in **src/main/cpp/types/libentry/index.d.ts**. When calling the API, pass in the JS resource object and the relative path of the raw file.
326
327      Example: Obtain a **resourceManager** object for intra-package resources within the application.
328
329       ```js
330       import hilog from '@ohos.hilog';
331       import testNapi from 'libentry.so'  // Import the libentry.so file.
332       @Entry
333       @Component
334       struct Index {
335           @State message: string = 'Hello World'
336           private resmgr = getContext().resourceManager; // Obtain the resourceManager object for intra-package resources within the application.
337           build() {
338               Row() {
339               Column() {
340                   Text(this.message)
341                   .fontSize(50)
342                   .fontWeight(FontWeight.Bold)
343                   .onClick(() => {
344                       hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO);
345                       let rawfilelist = testNapi.getFileList(this.resmgr, ""); // Pass in the JS resource object and the relative path of the raw file.
346                       console.log("rawfilelist" + rawfilelist);
347                       let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt");
348                       console.log("rawfileContet" + rawfileContet);
349                       let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt");
350                       console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length);
351                       let ret = testNapi.isRawDir(this.resmgr, "rawfile1.txt");
352                   })
353               }
354               .width('100%')
355               }
356               .height('100%')
357           }
358       }
359       ```
360