HarmonyOS 鸿蒙Next无法通过拼接沙箱路径的方式遍历rawfile目录下的文件夹

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

HarmonyOS 鸿蒙Next无法通过拼接沙箱路径的方式遍历rawfile目录下的文件夹 无法通过拼接沙箱路径的方式遍历rawfile目录下的文件夹

3 回复

应用hap包不解压引起fileIO无法访问rawfile目录下的文件,需要通过native接口来访问。

代码如下:

static napi_value GetRawFiles(napi_env env, napi_callback_info info) {
  OH_LOG_Print(LOG_APP, LOG_INFO, DOMAIN, TAG, "begin to GetFileList");
  size_t argc = 2;
  napi_value argv[2];
  napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);

  // parse param
  size_t strSize;
  char strBuf[256];
  napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
  std::string path(strBuf, strSize);
  OH_LOG_Print(LOG_APP, LOG_INFO, DOMAIN, TAG, "param path is : %{public}s", path.c_str());

  // get resourceManager
  NativeResourceManager *mNativeResMgr = OH_ResourceManager_InitNativeResourceManager(env, argv[0]);
  if (mNativeResMgr == nullptr) {
    OH_LOG_Print(LOG_APP, LOG_ERROR, DOMAIN, TAG, "InitNativeResourceManager failed");
    return nullptr;
  }

  // get file count
  RawDir *rawDir = OH_ResourceManager_OpenRawDir(mNativeResMgr, path.c_str());
  if (rawDir == nullptr) {
    OH_LOG_Print(LOG_APP, LOG_ERROR, DOMAIN, TAG, "OpenRawDir failed");
    return nullptr;
  }
  int count = OH_ResourceManager_GetRawFileCount(rawDir);
  OH_LOG_Print(LOG_APP, LOG_INFO, DOMAIN, TAG, "count is : %{public}d", count);

  // get file names
  std::vector<std::string> stringArray;
  for (int i = 0; i < count; ++i) {
    std::string fileName = OH_ResourceManager_GetRawFileName(rawDir, i);
    stringArray.emplace_back(fileName);
  }

  // release resource
  OH_ResourceManager_CloseRawDir(rawDir);
  OH_ResourceManager_ReleaseNativeResourceManager(mNativeResMgr);

  // wrap return val
  napi_value fileList;
  napi_create_array(env, &fileList);
  for (int i = 0; i < stringArray.size(); ++i) {
    napi_value jsString;
    napi_create_string_utf8(env, stringArray[i].c_str(), NAPI_AUTO_LENGTH, &jsString);
    napi_set_element(env, fileList, i, jsString);
  }
  return fileList;
}

let data = rawfile.GetRawFiles(this.resmgr, "");
if (data == null) {
  console.error(tag + " data is null");
  return;
}
for (let i in data) {
  console.error(tag + "file name is : " + data[i]);
  try {
    globalThis.jsResourceManager.getRawFileContent(data[i], (error, value) => {
      if (error != null) {
        // is dir, recall getFileList(data[i])
        console.info(tag + "getRawFileContent " + data[i] + " is dir");
      } else {
        // is file
        console.info(tag + "getRawFileContent value is " + value);
      }
    });
  } catch (error) {
    console.error(tag + "getRawFileContent failed, catch error code: ${error.code}, message: ${error.message}.");
  }
}

#include "napi/native_api.h"
#include "hilog/log.h"
#include <vector>

#include "rawfile/raw_file_manager.h"
#include "rawfile/raw_dir.h"

constexpr int DOMAIN = 0xA;
constexpr const char *TAG = "OHOS-GetRawFiles:";
constexpr const char *JS_RESOURCE_MANAGER = "jsResourceManager";

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
  napi_property_descriptor desc[] = {
  {"GetRawFiles", nullptr, GetRawFiles, nullptr, nullptr, nullptr, napi_default, nullptr },
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END

static napi_module demoModule = {
  .nm_version =1,
  .nm_flags = 0,
  .nm_filename = nullptr,
  .nm_register_func = Init,
  .nm_modname = "entry",
  .nm_priv = ((void*)0),
  .reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
  napi_module_register(&demoModule);
}

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(MyApplication18)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)

add_library(entry SHARED hello.cpp)
target_link_libraries(entry PUBLIC libace_napi.z.so)
target_link_libraries(entry PUBLIC libhilog_ndk.z.so)
target_link_libraries(entry PUBLIC librawfile.z.so)

更多关于HarmonyOS 鸿蒙Next无法通过拼接沙箱路径的方式遍历rawfile目录下的文件夹的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


resourceManager可以遍历吧,可以getrawfilecontent啥的

针对帖子标题中提到的问题,“HarmonyOS 鸿蒙Next无法通过拼接沙箱路径的方式遍历rawfile目录下的文件夹”,这通常是由于鸿蒙系统的安全机制导致的。在鸿蒙系统中,rawfile目录属于系统保留区域,其访问权限受到严格控制,不允许通过常规的文件路径拼接方式直接遍历。

鸿蒙系统采用了沙箱机制来增强应用的安全性,每个应用运行在自己的沙箱环境中,对系统资源的访问受到严格限制。这种设计旨在防止恶意应用通过遍历敏感目录来获取未授权的信息或执行未授权的操作。

因此,如果你的应用需要访问rawfile目录下的文件或文件夹,应该通过鸿蒙系统提供的API或特定接口来实现,而不是尝试通过拼接路径的方式。这些API或接口通常会要求应用具有相应的权限,并且可能需要在应用的manifest文件中声明这些权限。

如果你已经按照鸿蒙系统的规范进行了操作,但仍然无法访问rawfile目录下的文件夹,可能是因为你的应用没有获得必要的权限,或者你的操作方法不符合鸿蒙系统的安全要求。

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

回到顶部