From 139edcca52bc04b9643f58eb93370b91b29a3d68 Mon Sep 17 00:00:00 2001 From: Annie_wang Date: Thu, 6 Jul 2023 16:21:30 +0800 Subject: [PATCH] update docs Signed-off-by: Annie_wang --- en/application-dev/napi/figures/rawfile1.png | Bin 103107 -> 34833 bytes en/application-dev/napi/rawfile-guidelines.md | 625 +++++++++--------- .../reference/native-apis/rawfile.md | 493 ++++++++------ 3 files changed, 620 insertions(+), 498 deletions(-) diff --git a/en/application-dev/napi/figures/rawfile1.png b/en/application-dev/napi/figures/rawfile1.png index 9f29f7875cd983f967b7a3b27b5898bfce76c9f3..8e3ea5f2844a8124dee1bd3132b1cc86c70b8f64 100644 GIT binary patch literal 34833 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 literal 103107 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 z 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 Array; - export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array; - export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor; - ``` - -3. Modify the source file. - -1. Open the **src/main/cpp/hello.cpp** file. During initialization, the file maps the external JavaScript APIs **getFileList**, **getRawFileContent**, and **getRawFileDescriptor** to C++ native APIs **GetFileList**, **GetRawFileContent**, and **GetRawFileDescriptor**. - - ```c++ - 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 } - }; - - napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); - return exports; - } - EXTERN_C_END - ``` - -2. Add the three functions to the **src/main/cpp/hello.cpp** file. - - ```c++ - 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) - ``` - -3. Obtain JavaScript 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: - - ```c++ - // Example 1: Use GetFileList to obtain the raw file list. - 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 }; - // Obtain arguments of the native API. - napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); - - // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. - NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]); - - // Obtain argv[1], which specifies the relative path of the raw file. - size_t strSize; - char strBuf[256]; - napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize); - std::string dirName(strBuf, strSize); - - // Obtain the corresponding rawDir pointer object. - RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str()); - - // Obtain the number of files and folders in rawDir. - int count = OH_ResourceManager_GetRawFileCount(rawDir); - - // Traverse rawDir to obtain the list of file names and save it. - std::vector 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); - } - - // Close the rawDir pointer object. - OH_ResourceManager_CloseRawDir(rawDir); - OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); - return fileList; - } - - // Example 2: Use rawDir pointer object to obtain the content of the raw file. - napi_value CreateJsArrayValue(napi_env env, std::unique_ptr &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(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 }; - // Obtain arguments of the native API. - napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); - - // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. - 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); - - // Obtain the raw file pointer object. - 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"); - } - // Obtain the size of the raw file and apply for memory. - long len = OH_ResourceManager_GetRawFileSize(rawFile); - std::unique_ptr data= std::make_unique(len); - // Read the raw file. - int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len); - // Close the raw file pointer object. - OH_ResourceManager_CloseRawFile(rawFile); - OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); - // Convert the native object to a JavaScript object. - return CreateJsArrayValue(env, data, len); - } - - // Example 3: Use GetRawFileDescriptor to obtain the FD of the raw file. - 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 }; - // Obtain arguments of the native API. - napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); - - napi_valuetype valueType; - napi_typeof(env, argv[0], &valueType); - // Obtain the native resourceManager object. - 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); - // Obtain the raw file pointer object. - 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"); - } - // Obtain the FD of the raw file, that is, RawFileDescriptor {fd, offset, length}. - RawFileDescriptor descriptor; - OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); - // Close the raw file pointer object. - OH_ResourceManager_CloseRawFile(rawFile); - OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); - // Convert the native object to a JavaScript object. - return createJsFileDescriptor(env,descriptor); - } - ``` - -4. Call APIs on the JavaScript side. - -1. Open **src\main\ets\pages\index.ets**, and import **libentry.so**. - -2. Obtain the JavaScript resource object, that is, **resourceManager**. - -3. Call **getFileList**, that is, the native API declared in **src/main/cpp/types/libentry/index.d.ts**. When calling the API, pass the JavaScript resource object and the relative path of the raw file. The sample code is as follows: - - ```js - import hilog from '@ohos.hilog'; - import testNapi from 'libentry.so' // Import the libentry.so file. - @Entry - @Component - struct Index { - @State message: string = 'Hello World' - private resmgr = getContext().resourceManager; // Obtain the JavaScript resource object. - build() { - Row() { - Column() { - Text(this.message) - .fontSize(50) - .fontWeight(FontWeight.Bold) - .onClick(() => { - hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); - let rawfilelist = testNapi.getFileList(this.resmgr, ""); // Pass the JavaScript resource object and the relative path of the raw file. - console.log("rawfilelist" + rawfilelist); - let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt"); - console.log("rawfileContet" + rawfileContet); - let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt"); - console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length); - }) - } - .width('100%') - } - .height('100%') - } - } - ``` - -## Using C++ Functions +| API | Description | +| :----------------------------------------------------------- | :----------------------------------------------------------- | +| NativeResourceManager *OH_ResourceManager_InitNativeResourceManager(napi_env env, napi_value jsResMgr) | Initializes a Native resource manager instance. | +| RawDir *OH_ResourceManager_OpenRawDir(const NativeResourceManager *mgr, const char *dirName) | Opens a directory in the **rawfile** directory. | +| int OH_ResourceManager_GetRawFileCount(RawDir *rawDir) | Obtains the number of files in the specified directory. | +| const char *OH_ResourceManager_GetRawFileName(RawDir *rawDir, int index) | Obtains the name of a file in the **rawfile** directory. | +| RawFile *OH_ResourceManager_OpenRawFile(const NativeResourceManager *mgr, const char *fileName) | Opens a file in the **rawfile** directory. | +| long OH_ResourceManager_GetRawFileSize(RawFile *rawFile) | Obtains the size of a file in the **rawfile** directory. | +| int OH_ResourceManager_SeekRawFile(const RawFile *rawFile, long offset, int whence) | Seeks for the read/write position in a file in the **rawfile** directory based on the specified offset. | +| long OH_ResourceManager_GetRawFileOffset(const RawFile *rawFile) | Obtains the offset of a file. | +| int OH_ResourceManager_ReadRawFile(const RawFile *rawFile, void *buf, size_t length) | Reads data from a file in the **rawfile** directory. | +| void OH_ResourceManager_CloseRawFile(RawFile *rawFile) | Closes a file in the **rawfile** directory to release resources. | +| void OH_ResourceManager_CloseRawDir(RawDir *rawDir) | Closes a directory in the **rawfile** directory to release resources. | +| bool OH_ResourceManager_GetRawFileDescriptor(const RawFile *rawFile, RawFileDescriptor &descriptor) | Obtains the file descriptor (FD) of a file in the **rawfile** directory. | +| bool OH_ResourceManager_ReleaseRawFileDescriptor(const RawFileDescriptor &descriptor) | Releases the FD of a file in the **rawfile** directory. | +| void OH_ResourceManager_ReleaseNativeResourceManager(NativeResourceManager *resMgr) | Releases a Native resource manager instance. | + +## Functions 1. Call **OH_ResourceManager_OpenRawDir** to obtain a **RawDir** instance based on the **NativeResourceManager** instance. ```c++ RawDir* rawDir = OH_ResourceManager_OpenRawDir(nativeResourceManager, path.c_str()); ``` - -2. Call **OH_ResourceManager_GetRawFileCount** to obtain the total number of raw files in the directory based on the **RawDir** instance. + +2. Call **OH_ResourceManager_GetRawFileCount** to obtain the total number of files in the directory based on the **RawDir** instance. ```c++ int count = OH_ResourceManager_GetRawFileCount(rawDir); ``` - -3. Call **OH_ResourceManager_GetRawFileName** to obtain the name of the raw file with the specified index. + +3. Call **OH_ResourceManager_GetRawFileName** to obtain the name of a file based on the specified index. ```c++ for (int index = 0; index < count; index++) { @@ -315,19 +45,19 @@ After a project is created, the **cpp** directory is created under the project. } ``` -4. Call **OH_ResourceManager_OpenRawFile** to obtain a **RawFile** instance with the specified file name. +4. Call **OH_ResourceManager_OpenRawFile** to open a **RawFile** instance with the specified file name. ```c++ RawFile* rawFile = OH_ResourceManager_OpenRawFile(nativeResourceManager, fileName.c_str()); ``` - -5. Call **OH_ResourceManager_GetRawFileSize** to obtain the size of the raw file. + +5. Call **OH_ResourceManager_GetRawFileSize** to obtain the size of the file. ```c++ long rawFileSize = OH_ResourceManager_GetRawFileSize(rawFile); ``` -6. Call **OH_ResourceManager_SeekRawFile** to seek a read/write position in the raw file based on the specified offset. +6. Call **OH_ResourceManager_SeekRawFile** to seek for the read/write position in the file based on the specified offset. ```c++ int position = OH_ResourceManager_SeekRawFile(rawFile, 10, 0); @@ -335,13 +65,13 @@ After a project is created, the **cpp** directory is created under the project. int position = OH_ResourceManager_SeekRawFile(rawFile, -10, 2); ``` -7. Call **OH_ResourceManager_GetRawFileOffset** to obtain the raw file offset. +7. Call **OH_ResourceManager_GetRawFileOffset** to obtain the file offset. ```c++ long rawFileOffset = OH_ResourceManager_GetRawFileOffset(rawFile) ``` -8. Call **OH_ResourceManager_ReadRawFile** to read the raw file. +8. Call **OH_ResourceManager_ReadRawFile** to read a file. ```c++ std::unique_ptr mediaData = std::make_unique(rawFileSize); @@ -354,27 +84,314 @@ After a project is created, the **cpp** directory is created under the project. OH_ResourceManager_CloseRawFile(rawFile); ``` -10. Call **OH_ResourceManager_CloseRawDir** to close the raw file directory. +10. Call **OH_ResourceManager_CloseRawDir** to close the file directory. ```c++ OH_ResourceManager_CloseRawDir(rawDir); ``` -11. Call **OH_ResourceManager_GetRawFileDescriptor** to obtain the FD of the raw file. +11. Call **OH_ResourceManager_GetRawFileDescriptor** to obtain the FD of the file. ```c++ RawFileDescriptor descriptor; bool result = OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); ``` -12. Call **OH_ResourceManager_ReleaseRawFileDescriptor** to release the FD of the raw file. +12. Call **OH_ResourceManager_ReleaseRawFileDescriptor** to release the FD of the file. ```c++ OH_ResourceManager_ReleaseRawFileDescriptor(descriptor); ``` -13. Call **OH_ResourceManager_ReleaseNativeResourceManager** to release the native resource manager. +13. Call **OH_ResourceManager_ReleaseNativeResourceManager** to release the Native resource manager. ```c++ OH_ResourceManager_ReleaseNativeResourceManager(nativeResourceManager); ``` + +## How to Develop + +The following describes how to obtain the file list in the **rawfile** directory, file content, and FD {fd, offset, length} on the JavaScript side as an example. + +1. Create a project. + + ![Creating a C++ application](figures/rawfile1.png) + +2. Add dependencies. + + After the project is created, the **cpp** directory is created under the project. The directory contains files such as **libentry/index.d.ts**, **hello.cpp**, and **CMakeLists.txt**. + + 1. Open the **src/main/cpp/CMakeLists.txt** file, and add **librawfile.z.so** and **libhilog_ndk.z.so** to **target_link_libraries**. + + ``` + target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so librawfile.z.so) + ``` + + + + 2. Open the **src/main/cpp/types/libentry/index.d.ts** file, and declare the application functions **getFileList**, **getRawFileContent**, and **getRawFileDescriptor**. + + ```c++ + import resourceManager from '@ohos.resourceManager'; + export const getFileList: (resmgr: resourceManager.ResourceManager, path: string) => Array; + export const getRawFileContent: (resmgr: resourceManager.ResourceManager, path: string) => Uint8Array; + export const getRawFileDescriptor: (resmgr: resourceManager.ResourceManager, path: string) => resourceManager.RawFileDescriptor; + ``` + + + +3. Modify the source file. + + 1. Open the **src/main/cpp/hello.cpp** file. During initialization, the file maps the external JavaScript APIs **getFileList**, **getRawFileContent**, and **getRawFileDescriptor** to C++ native APIs **GetFileList**, **GetRawFileContent**, and **GetRawFileDescriptor**. + + ```c++ + 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 } + }; + + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; + } + EXTERN_C_END + ``` + + + + 2. Add the three functions to the **src/main/cpp/hello.cpp** file. + + ```c++ + 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) + ``` + + + + 3. Obtain JavaScript resource objects from the **hello.cpp** file, and convert them to Native resource objects. Then, call the Native APIs to obtain the file list, file content, and FD {fd, offset, length}. + + The sample code is as follows: + + ```c++ + // Example 1: Use GetFileList to obtain the raw file list. + 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 }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. + NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]); + + // Obtain argv[1], which specifies the relative path of the raw file. + size_t strSize; + char strBuf[256]; + napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize); + std::string dirName(strBuf, strSize); + + // Obtain the corresponding rawDir pointer object. + RawDir* rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, dirName.c_str()); + + // Obtain the number of files and folders in rawDir. + int count = OH_ResourceManager_GetRawFileCount(rawDir); + + // Traverse rawDir to obtain the list of file names and save it. + std::vector 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); + } + + // Close the rawDir pointer object. + OH_ResourceManager_CloseRawDir(rawDir); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + return fileList; + } + + // Example 2: Use rawDir pointer object to obtain the content of the raw file. + napi_value CreateJsArrayValue(napi_env env, std::unique_ptr &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(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 }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + // Obtain argv[0], which specifies conversion of the JavaScript resource object (that is, OH_ResourceManager_InitNativeResourceManager) to a native object. + 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); + + // Obtain the raw file pointer object. + 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"); + } + // Obtain the size of the raw file and apply for memory. + long len = OH_ResourceManager_GetRawFileSize(rawFile); + std::unique_ptr data= std::make_unique(len); + // Read the raw file. + int res = OH_ResourceManager_ReadRawFile(rawFile, data.get(), len); + // Close the rawDir pointer object. + OH_ResourceManager_CloseRawFile(rawFile); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + // Convert the native object to a JavaScript object. + return CreateJsArrayValue(env, data, len); + } + + // Example 3: Use GetRawFileDescriptor to obtain the FD of the raw file. + 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 }; + // Obtain arguments of the native API. + napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); + + napi_valuetype valueType; + napi_typeof(env, argv[0], &valueType); + // Obtain the native resourceManager object. + 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); + // Obtain the raw file pointer object. + 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"); + } + // Obtain the FD of the raw file, that is, RawFileDescriptor {fd, offset, length}. + RawFileDescriptor descriptor; + OH_ResourceManager_GetRawFileDescriptor(rawFile, descriptor); + // Close the rawDir pointer object. + OH_ResourceManager_CloseRawFile(rawFile); + OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr); + // Convert the native object to a JavaScript object. + return createJsFileDescriptor(env,descriptor); + } + ``` + + + +4. Call JavaScript APIs. + + 1. Open **src\main\ets\pages\index.ets**, and import **libentry.so**. + + 2. Obtain the JavaScript resource object, that is, **resourceManager**. + + 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 JavaScript resource object and the relative path of the file. + + The sample code is as follows: + + ```js + import hilog from '@ohos.hilog'; + import testNapi from 'libentry.so' // Import the libentry.so file. + @Entry + @Component + struct Index { + @State message: string = 'Hello World' + private resmgr = getContext().resourceManager; // Obtain the JavaScript resource object. + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + .onClick(() => { + hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); + let rawfilelist = testNapi.getFileList(this.resmgr, ""); // Pass the JavaScript resource object and the relative path of the raw file. + console.log("rawfilelist" + rawfilelist); + let rawfileContet = testNapi.getRawFileContent(this.resmgr, "rawfile1.txt"); + console.log("rawfileContet" + rawfileContet); + let rawfileDescriptor = testNapi.getRawFileDescriptor(this.resmgr, "rawfile1.txt"); + console.log("getRawFileDescriptor" + rawfileDescriptor.fd, rawfileDescriptor.offset, rawfileDescriptor.length); + }) + } + .width('100%') + } + .height('100%') + } + } + ``` + + + diff --git a/en/application-dev/reference/native-apis/rawfile.md b/en/application-dev/reference/native-apis/rawfile.md index 7314b4b36e..d77f9e4fb1 100644 --- a/en/application-dev/reference/native-apis/rawfile.md +++ b/en/application-dev/reference/native-apis/rawfile.md @@ -1,13 +1,11 @@ # Rawfile -## Overview +Provides APIs for operating the **rawfile** directory and its files, including traversing the **rawfile** directory and opening, searching for, reading, and closing a file in it. -Provides the function of operating rawfile directories and rawfiles. +**Since** -These functions include traversing, opening, searching, reading, and closing rawfiles. -**Since:** 8 @@ -16,399 +14,506 @@ These functions include traversing, opening, searching, reading, and closing raw ### Files -| Name | Description | -| -------- | -------- | -| [raw_dir.h](raw__dir_8h.md) | Provides functions for operating rawfile directories.
File to Include: | -| [raw_file.h](raw__file_8h.md) | Provides functions for operating rawfiles.
File to Include: | -| [raw_file_manager.h](raw__file__manager_8h.md) | Provides functions for managing rawfile resources.
File to Include: | +| Name | Description | +| ---------------------------------------- | ------------------ | +| [raw_dir.h](raw__dir_8h.md) | Provides functions related to the **rawfile** directory.
File to include: \ | +| [raw_file.h](raw__file_8h.md) | Provides functions related to the files in the **rawfile** directory.
File to include: \ | +| [raw_file_manager.h](raw__file__manager_8h.md) | Provides file management functions for the **rawfile** directory.
File to import: \| ### Structs -| Name | Description | -| -------- | -------- | -| [RawFileDescriptor](_raw_file_descriptor.md) | Provides rawfile descriptor information. | +| Name | Description | +| ---------------------------------------- | ----------------- | +| [RawFileDescriptor](_raw_file_descriptor.md) | Defines the file descriptor (FD) information of a file in the **rawfile** directory. | ### Types -| Name | Description | -| -------- | -------- | -| [RawDir](#rawdir) | Provides the function of accessing rawfile directories. | -| [RawFile](#rawfile) | Provides the function of accessing rawfiles. | -| [NativeResourceManager](#nativeresourcemanager) | Implements the resource manager. | +| Name | Description | +| ---------------------------------------- | ------------------- | +| [RawDir](#rawdir) | Provides access to the **rawfile** directory. | +| [RawFile](#rawfile) | Provides access to the files in **rawfile**. | +| [NativeResourceManager](#nativeresourcemanager) | Represents the resource manager.| ### Functions -| Name | Description | -| -------- | -------- | -| [OH_ResourceManager_GetRawFileName](#oh_resourcemanager_getrawfilename) ([RawDir](#rawdir) \*rawDir, int index) | Obtains the rawfile name via an index. | -| [OH_ResourceManager_GetRawFileCount](#oh_resourcemanager_getrawfilecount) ([RawDir](#rawdir) \*rawDir) |Obtains the number of rawfiles in [RawDir](#rawdir). | -| [OH_ResourceManager_CloseRawDir](#oh_resourcemanager_closerawdir) ([RawDir](#rawdir) \*rawDir) | Closes an opened [RawDir](#rawdir) and releases all associated resources. | -| [OH_ResourceManager_ReadRawFile](#oh_resourcemanager_readrawfile) (const [RawFile](#rawfile) \*rawFile, void \*buf, size_t length) |Reads a rawfile. | -| [OH_ResourceManager_SeekRawFile](#oh_resourcemanager_seekrawfile) (const [RawFile](#rawfile) \*rawFile, long offset, int whence) |Seeks for the data read/write position in the rawfile based on the specified offset. | -| [OH_ResourceManager_GetRawFileSize](#oh_resourcemanager_getrawfilesize) ([RawFile](#rawfile) \*rawFile) | Obtains the length of a rawfile in int32_t. | -| [OH_ResourceManager_CloseRawFile](#oh_resourcemanager_closerawfile) ([RawFile](#rawfile) \*rawFile) | Closes an opened [RawFile](#rawfile) and releases all associated resources. | -| [OH_ResourceManager_GetRawFileOffset](#oh_resourcemanager_getrawfileoffset) (const [RawFile](#rawfile) \*rawFile) | Obtains the current offset of the rawfile in int32_t. | -| [OH_ResourceManager_GetRawFileDescriptor](#oh_resourcemanager_getrawfiledescriptor) (const [RawFile](#rawfile) \*rawFile, [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | Opens a rawfile descriptor. | -| [OH_ResourceManager_ReleaseRawFileDescriptor](#oh_resourcemanager_releaserawfiledescriptor) (const [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | Closes a rawfile descriptor. | -| [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager) (napi_env env, napi_value jsResMgr) | Obtains the native resource manager based on JavaScipt resource manager. | -| [OH_ResourceManager_ReleaseNativeResourceManager](#oh_resourcemanager_releasenativeresourcemanager) ([NativeResourceManager](#nativeresourcemanager) \*resMgr) | Releases a native resource manager. | -| [OH_ResourceManager_OpenRawDir](#oh_resourcemanager_openrawdir) (const [NativeResourceManager](#nativeresourcemanager) \*mgr, const char \*dirName) | Opens a rawfile directory. | -| [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile) (const [NativeResourceManager](#nativeresourcemanager) \*mgr, const char \*fileName) | Opens a rawfile. | +| Name | Description | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [OH_ResourceManager_GetRawFileName](#oh_resourcemanager_getrawfilename) ([RawDir](#rawdir) \*rawDir, int index) | Obtains the name of a file in **rawfile** based on the index. | +| [OH_ResourceManager_GetRawFileCount](#oh_resourcemanager_getrawfilecount) ([RawDir](#rawdir) \*rawDir) | Obtains the number of files in a [RawDir](#rawdir). | +| [OH_ResourceManager_CloseRawDir](#oh_resourcemanager_closerawdir) ([RawDir](#rawdir) \*rawDir) | Closes a [RawDir](#rawdir) and releases all associated resources. | +| [OH_ResourceManager_ReadRawFile](#oh_resourcemanager_readrawfile) (const [RawFile](#rawfile) \*rawFile, void \*buf, size_t length) | Reads data from a file in **rawfile**. | +| [OH_ResourceManager_SeekRawFile](#oh_resourcemanager_seekrawfile) (const [RawFile](#rawfile) \*rawFile, long offset, int whence) | Seeks for the data read/write position in a file in **rawfile** based on the specified offset. | +| [OH_ResourceManager_GetRawFileSize](#oh_resourcemanager_getrawfilesize) ([RawFile](#rawfile) \*rawFile) | Obtains the size of a file in **rawfile**. | +| [OH_ResourceManager_CloseRawFile](#oh_resourcemanager_closerawfile) ([RawFile](#rawfile) \*rawFile) | Closes a [RawFile](#rawfile) and releases all associated resources. | +| [OH_ResourceManager_GetRawFileOffset](#oh_resourcemanager_getrawfileoffset) (const [RawFile](#rawfile) \*rawFile) | Obtains the current offset of a file in **rawfile**. | +| [OH_ResourceManager_GetRawFileDescriptor](#oh_resourcemanager_getrawfiledescriptor) (const [RawFile](#rawfile) \*rawFile, [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | Opens a file in **rawfile** based on the offset and file length and obtains the FD. | +| [OH_ResourceManager_ReleaseRawFileDescriptor](#oh_resourcemanager_releaserawfiledescriptor) (const [RawFileDescriptor](_raw_file_descriptor.md) &descriptor) | Releases an FD. | +| [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager) (napi_env env, napi_value jsResMgr) | Initializes a Native resource manager using the JavaScript resource manager. You can use the Native resource manager obtained to implement operations related to **rawfile**. | +| [OH_ResourceManager_ReleaseNativeResourceManager](#oh_resourcemanager_releasenativeresourcemanager) ([NativeResourceManager](#nativeresourcemanager) \*resMgr) | Releases a Native resource manager instance. | +| [OH_ResourceManager_OpenRawDir](#oh_resourcemanager_openrawdir) (const [NativeResourceManager](#nativeresourcemanager) \*mgr, const char \*dirName) | Opens a directory in the **rawfile** directory. | +| [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile) (const [NativeResourceManager](#nativeresourcemanager) \*mgr, const char \*fileName) | Opens a file in the **rawfile** directory. | -## Type Description +## Description -### NativeResourceManager +### Type Description + + +#### NativeResourceManager + - ``` -typedef struct NativeResourceManagerNativeResourceManager +typedef struct NativeResourceManager NativeResourceManager ``` -**Description**
-Implements the resource manager. -This class encapsulates the native implementation of the JavaScript resource manager. You can obtain the pointer to **ResourceManager** by calling [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager). +**Description** + +Represents the resource manager. + +This class encapsulates the native implementation of the JavaScript resource manager. The **ResourceManager** pointer can be obtained by using [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager). + +**Since** + +8 + +#### RawDir -### RawDir - ``` -typedef struct RawDirRawDir +typedef struct RawDir RawDir ``` -**Description**
-Provides the function of accessing rawfile directories. + +**Description** + +Provides access to the **rawfile** directory. + +**Since** + +8 -### RawFile +#### RawFile + - ``` -typedef struct RawFileRawFile +typedef struct RawFile RawFile ``` -**Description**
-Provides the function of accessing rawfiles. +**Description** + +Provides access to the files in **rawfile**. + +**Since** + +8 + + +### Function Description -## Function Description +#### OH_ResourceManager_CloseRawDir() -### OH_ResourceManager_CloseRawDir() - ``` void OH_ResourceManager_CloseRawDir (RawDir * rawDir) ``` -**Description**
-Closes an opened [RawDir](#rawdir) and releases all associated resources. - **Parameters** +**Description** -| Name | Description | -| -------- | -------- | -| rawDir | Indicates the pointer to [RawDir](#rawdir). | +Closes a [RawDir](#rawdir) opened and releases all associated resources. - **See** +**Parameters** + +| Name | Description | +| ------ | ------------------------- | +| rawDir | Pointer to the [RawDir](#rawdir) to close.| + +**See** [OH_ResourceManager_OpenRawDir](#oh_resourcemanager_openrawdir) +**Since** + +8 + + +#### OH_ResourceManager_CloseRawFile() -### OH_ResourceManager_CloseRawFile() - ``` void OH_ResourceManager_CloseRawFile (RawFile * rawFile) ``` -**Description**
-Closes an opened [RawFile](#rawfile) and releases all associated resources. - **Parameters** +**Description** -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | +Closes a [RawFile](#rawfile) and releases all associated resources. - **See** +**Parameters** + +| Name | Description | +| ------- | --------------------------- | +| rawFile | Pointer to the [RawFile](#rawfile) to close.| + +**See** [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile) +**Since** + +8 + + +#### OH_ResourceManager_GetRawFileCount() -### OH_ResourceManager_GetRawFileCount() - ``` int OH_ResourceManager_GetRawFileCount (RawDir * rawDir) ``` -**Description**
-Obtains the number of rawfiles in [RawDir](#rawdir). + +**Description** + +Obtains the number of files in a [RawDir](#rawdir). You can use this function to obtain available indexes in [OH_ResourceManager_GetRawFileName](#oh_resourcemanager_getrawfilename). - **Parameters** +**Parameters** -| Name | Description | -| -------- | -------- | -| rawDir | Indicates the pointer to [RawDir](#rawdir). | +| Name | Description | +| ------ | ------------------------- | +| rawDir | Pointer to the target [RawDir](#rawdir).| - **See** +**See** [OH_ResourceManager_GetRawFileName](#oh_resourcemanager_getrawfilename) +**Since** + +8 + + +#### OH_ResourceManager_GetRawFileDescriptor() -### OH_ResourceManager_GetRawFileDescriptor() - ``` bool OH_ResourceManager_GetRawFileDescriptor (const RawFile * rawFile, RawFileDescriptor & descriptor ) ``` -**Description**
-Opens a rawfile descriptor. -After the descriptor is opened, you can use it to read the rawfile based on the offset (in int32_t) and file length. +**Description** + +Opens a file in the **rawfile** directory based on the offset and file length and obtains the FD. - **Parameters** +The FD obtained can be used to read the file. -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | -| descriptor | Indicates the rawfile descriptor, and the start position and length of the rawfile file in the HAP package. | +**Parameters** + +| Name | Description | +| ---------- | ---------------------------------------------------- | +| rawFile | Pointer to the [RawFile](#rawfile). | +| descriptor | File descriptor of the file, start position of the file in the hAP, and length of the file.| **Returns** -Returns **true** if the rawfile descriptor is opened successfully; returns **false** if the rawfile cannot be accessed. +Returns true if the file is opened; returns false if the access to the file is rejected. + +**Since** + +8 -### OH_ResourceManager_GetRawFileName() +#### OH_ResourceManager_GetRawFileName() + - ``` const char* OH_ResourceManager_GetRawFileName (RawDir * rawDir, int index ) ``` -**Description**
-Obtains the rawfile name via an index. -You can use this function to traverse a rawfile directory. +**Description** + +Obtains the name of a file in **rawfile** based on the index. + +You can use this function to traverse the **rawfile** directory. - **Parameters** +**Parameters** -| Name | Description | -| -------- | -------- | -| rawDir | Indicates the pointer to [RawDir](#rawdir). | -| index | Indicates the index of the file in [RawDir](#rawdir). | +| Name | Description | +| ------ | ----------------------------- | +| rawDir | Pointer to the [RawDir](#rawdir). | +| index | Index of the file in the [RawDir](#rawdir).| **Returns** -Returns the rawfile name via an index. The return value can be used as the input parameter of [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile). If no rawfile is found after all rawfiles are traversed, **NULL** will be returned. +Returns the file name obtained if the file exists in the directory; returns **null** otherwise. The file name returned can be used as the input parameter of [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile). - **See** +**See** [OH_ResourceManager_OpenRawFile](#oh_resourcemanager_openrawfile) +**Since** + +8 + + +#### OH_ResourceManager_GetRawFileOffset() -### OH_ResourceManager_GetRawFileOffset() - ``` long OH_ResourceManager_GetRawFileOffset (const RawFile * rawFile) ``` -**Description**
-Obtains the current offset of the rawfile in int32_t. - **Parameters** +**Description** + +Obtains the current offset of a file in **rawfile**. + +The offset indicates the position of the file in the HAP. -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | +**Parameters** + +| Name | Description | +| ------- | --------------------------- | +| rawFile | Pointer to the target [RawFile](#rawfile).| **Returns** -Returns the current offset of the rawfile. +Returns the file offset obtained. + +**Since** + +8 -### OH_ResourceManager_GetRawFileSize() +#### OH_ResourceManager_GetRawFileSize() + - ``` long OH_ResourceManager_GetRawFileSize (RawFile * rawFile) ``` -**Description**
-Obtains the length of a rawfile in int32_t. - **Parameters** +**Description** + +Obtains the size of a file in **rawfile**. + +**Parameters** -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | +| Name | Description | +| ------- | --------------------------- | +| rawFile | Pointer to the target [RawFile](#rawfile).| **Returns** -Returns the total length of the rawfile. +Returns the file size obtained. +**Since** + +8 + + +#### OH_ResourceManager_InitNativeResourceManager() -### OH_ResourceManager_InitNativeResourceManager() - ``` NativeResourceManager* OH_ResourceManager_InitNativeResourceManager (napi_env env, napi_value jsResMgr ) ``` -**Description**
-Obtains the native resource manager based on JavaScipt resource manager. -After obtaining a resource manager, you can use it complete various rawfile operations. +**Description** + +Initializes a Native resource manager using the JavaScript resource manager. + +You can use the resource manager obtained to implement **rawfile** operations. - **Parameters** +**Parameters** -| Name | Description | -| -------- | -------- | -| env | Indicates the pointer to the JavaScipt Native Interface (napi) environment. | -| jsResMgr | Indicates the JavaScipt resource manager. | +| Name | Description | +| -------- | ---------------------------------------- | +| env | Pointer to the JavaScript Native API (napi) environment.| +| jsResMgr | JavaScript resource manager. | **Returns** -Returns the pointer to [NativeResourceManager](#nativeresourcemanager). +Returns the pointer to the [NativeResourceManager](#nativeresourcemanager) obtained. +**Since** + +8 + + +#### OH_ResourceManager_OpenRawDir() -### OH_ResourceManager_OpenRawDir() - ``` RawDir* OH_ResourceManager_OpenRawDir (const NativeResourceManager * mgr, const char * dirName ) ``` -**Description**
-Opens a rawfile directory. -After opening a rawfile directory, you can traverse all the rawfile files in it. +**Description** - **Parameters** +Opens a directory in **rawfile**. -| Name | Description | -| -------- | -------- | -| mgr | Indicates the pointer to [NativeResourceManager](#nativeresourcemanager). You can obtain this pointer by calling [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager). | -| dirName | Indicates the name of the rawfile directory to open. If this field is left empty, the root directory of rawfile will be opened. | +After opening the directory, you can traverse all files in it. + +**Parameters** + +| Name | Description | +| ------- | ---------------------------------------- | +| mgr | Pointer to the [NativeResourceManager](#nativeresourcemanager), which is obtained by using [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager).| +| dirName | Pointer to the name of the directory to open. If this field is left empty, the root directory will be opened.| **Returns** -Returns the pointer to [RawDir](#rawdir). If this pointer is no longer needed after use, call [OH_ResourceManager_CloseRawDir](#oh_resourcemanager_closerawdir) to release it. +Returns the pointer to the [RawDir](#rawdir) opened. You can use [OH_ResourceManager_CloseRawDir](#oh_resourcemanager_closerawdir) to close the directory and release resources. - **See** +**See** [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager) [OH_ResourceManager_CloseRawDir](#oh_resourcemanager_closerawdir) +**Since** + +8 + + +#### OH_ResourceManager_OpenRawFile() -### OH_ResourceManager_OpenRawFile() - ``` RawFile* OH_ResourceManager_OpenRawFile (const NativeResourceManager * mgr, const char * fileName ) ``` -**Description**
-Opens a rawfile. -After a rawfile is opened, you can read the data in it. +**Description** - **Parameters** +Opens a file in **rawfile**. -| Name | Description | -| -------- | -------- | -| mgr | Indicates the pointer to [NativeResourceManager](#nativeresourcemanager). You can obtain this pointer by calling [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager). | -| fileName | Indicates the file name in the relative path of the rawfile root directory. | +After the file is opened, you can read data in it. + +**Parameters** + +| Name | Description | +| -------- | ---------------------------------------- | +| mgr | Pointer to the [NativeResourceManager](#nativeresourcemanager), which is obtained by using [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager).| +| fileName | Pointer to the name of the file in the relative path of the **rawfile** root directory. | **Returns** -Returns the pointer to [RawFile](#rawfile). If this pointer is no longer needed after use, call [OH_ResourceManager_CloseRawFile](#oh_resourcemanager_closerawfile) to release it. +Returns the pointer to the [RawFile](#rawfile) opened. You can use [OH_ResourceManager_CloseRawFile](#oh_resourcemanager_closerawfile) to close the file and release resources. - **See** +**See** [OH_ResourceManager_InitNativeResourceManager](#oh_resourcemanager_initnativeresourcemanager) [OH_ResourceManager_CloseRawFile](#oh_resourcemanager_closerawfile) +**Since** + +8 + + +#### OH_ResourceManager_ReadRawFile() -### OH_ResourceManager_ReadRawFile() - ``` int OH_ResourceManager_ReadRawFile (const RawFile * rawFile, void * buf, size_t length ) ``` -**Description**
-Reads a rawfile. + +**Description** + +Reads a file in **rawfile**. You can use this function to read data of the specified length from the current position. - **Parameters** +**Parameters** -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | -| buf | Indicates the pointer to the buffer for storing the read data. | -| length | Indicates the length of the read data, in bytes. | +| Name | Description | +| ------- | --------------------------- | +| rawFile | Pointer to the [RawFile](#rawfile) to read.| +| buf | Pointer to the buffer for receiving the read data. | +| length | Length of the data to read. | **Returns** -Returns the length of the read data in bytes. If the length is beyond the end of the rawfile, **0** will be returned. +Returns the number of bytes read. If the read length exceeds the length of the file end, **0** will be returned. + +**Since** +8 + + +#### OH_ResourceManager_ReleaseNativeResourceManager() -### OH_ResourceManager_ReleaseNativeResourceManager() - ``` void OH_ResourceManager_ReleaseNativeResourceManager (NativeResourceManager * resMgr) ``` -**Description**
-Releases a native resource manager. - **Parameters** +**Description** + +Releases a Native resource manager instance. + +**Parameters** + +| Name | Description | +| ------ | ---------------------------------------- | +| resMgr | Pointer to the [NativeResourceManager](#nativeresourcemanager) instance to release.| + +**Since** + +8 -| Name | Description | -| -------- | -------- | -| resMgr | Indicates the pointer to [NativeResourceManager](#nativeresourcemanager). | +#### OH_ResourceManager_ReleaseRawFileDescriptor() -### OH_ResourceManager_ReleaseRawFileDescriptor() - ``` bool OH_ResourceManager_ReleaseRawFileDescriptor (const RawFileDescriptor & descriptor) ``` -**Description**
-Closes a rawfile descriptor. -To prevent file descriptor leakage, you are advised to release a rawfile descriptor after use. +**Description** + +Releases the FD of a file in **rawfile**. + +To prevent FD leakage, you are advised to release an FD immediately after use. - **Parameters** +**Parameters** -| Name | Description | -| -------- | -------- | -| descriptor | Indicates the rawfile descriptor, and the start position and length of the rawfile file in the HAP package. | +| Name | Description | +| ---------- | ------------------------------------------------------------ | +| descriptor | File descriptor to close. It contains the FD, start position in the HAP, and file length. | **Returns** -Returns **true** if the rawfile descriptor is closed successfully; returns **false** otherwise. +Returns true if the FD is released; returns false otherwise. + +**Since** + +8 -### OH_ResourceManager_SeekRawFile() +#### OH_ResourceManager_SeekRawFile() + - ``` int OH_ResourceManager_SeekRawFile (const RawFile * rawFile, long offset, int whence ) ``` -**Description**
-Seeks for the data read/write position in the rawfile based on the specified offset. - **Parameters** +**Description** + +Seeks for the data read/write position in a file in **rawfile** based on the specified offset. + +**Parameters** -| Name | Description | -| -------- | -------- | -| rawFile | Indicates the pointer to [RawFile](#rawfile). | -| offset | Indicates the specified offset. | -| whence | Indicates the data read/write position. The options are as follows:
**0**: The read/write position is **offset**.
**1**: The read/write position is the current position plus **offset**.
**2**: The read/write position is the end of the file (EOF) plus **offset**. | +| Name | Description | +| ------- | ---------------------------------------- | +| rawFile | Pointer to the target [RawFile](#rawfile). | +| offset | Offset. | +| whence | Read/Write position. The options are as follows:
**0**: The read/write position is the offset.
**1**: The read/write position is the current position plus the offset.
**2**: The read/write position is the end of the file (EOF) plus the offset.| **Returns** -Returns the new data read/write position if the operation is successful; returns **(long) -1** otherwise. +Returns the read/write position if the operation is successful; returns **(long) -1** otherwise. + +**Since** + +8 -- GitLab