HarmonyOS 调用OH_FileUri_GetPathFromUri接口后,获得的文件路径无法打开,报错为文件不存在

调用OH_FileUri_GetPathFromUri接口后,获得的文件路径无法打开,报错为文件不存在。 使用OH_FileUri_IsValidUri(),校验uri为有效uri。

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

需要确认下是否已经主动创建好对应的目录,open并不会自动创建目录,以下是推荐的c侧打开方案

function openNormalFile() {
  const documentSelectOptions = new picker.DocumentSelectOptions();
  documentSelectOptions.maxSelectNumber = 1; // 选择文档的最大数目(可选)
  documentSelectOptions.defaultFilePathUri = "file://docs/storage/Users/currentUser"; // 指定选择的文件或者目录路径(可选)
  // documentSelectOptions.fileSuffixFilters = ['.txt']; // 选择文件的后缀类型(可选)

  let uris: Array<string> = [];
  const documentViewPicker = new picker.DocumentViewPicker(); // 创建文件选择器实例
  documentViewPicker.select(documentSelectOptions).then((documentSelectResult: Array<string>) => {
    uris = documentSelectResult;

    let uri: string = uris[0];

    console.info(`[LZR_INFO]Open Normal File path is [${uri}]`)
    /*
    * 此处fs可以传递应用沙箱文件路径
    * let context = getContext(this) as common.UIAbilityContext;
    * let filesDir = context.filesDir+'/文件名+.后缀';
    */
    let file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    //成功打开对应文件会输出Open File Successfully !!!
    testNapi.OpenFileByFd(file.fd);

  }).catch((err: BusinessError) => {
    console.error(`[LZR_ERROR]Open Normal file failed, error code is [${err.code}], error message is [${err.message}]`);
  })
}

// 根据传入的fd打开文件
static napi_value OpenFileByFd(napi_env env, napi_callback_info info) {
  // 从info中取出JS传递过来的参数放入args
  size_t argc = 1;
  napi_value args[1] = {nullptr};
  if (napi_ok != napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)) {
    napi_throw_error(env, "-1000", "napi_get_cb_info error");
    return nullptr;
  }

  unsigned int fd = -1;
  napi_get_value_uint32(env, args[0], &fd);

  char buff[1000];

  if (read(fd, buff, sizeof(buff)) == -1) {
    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "Open File Failed !!!");
  } else {
    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "Open File Successfully !!!");

    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "Text: \n%{public}s", buff);
  }


  // // fd -> file path
  snprintf(buff, sizeof(buff), "/proc/self/fd/%d", fd);
  char file_path[1000] = {'0'};

  if (readlink(buff, file_path, sizeof(file_path) - 1) != -1) {
    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "get File path: \n%{public}s", file_path);
  }

  FILE *file = fopen(file_path, "r");

  if (file == NULL) {
    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "Open File:[%{public}s] Failed!!!",
      file_path);
    return 0;
  }

  // 打开文件成功,可以进行文件操作
  OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, "[LZR_DEBUG_NAPI]", "Open File:[%{public}s]Successfully!!!",
    file_path);

  return 0;
}
分享
微博
QQ
微信
回复
1天前
相关问题
如何实现文件不存在则创建文件
2145浏览 • 1回复 待解决
HarmonyOS 安装时报错依赖模块不存在
1002浏览 • 1回复 待解决
真机运行,UDID不存在
6120浏览 • 1回复 待解决
HarmonyOS 哪些情况下主窗口不存在
35浏览 • 1回复 待解决
HarmonyOS avplayer播放fd路径文件报错
72浏览 • 1回复 待解决
HarmonyOS 文件读写权限如何获得
523浏览 • 1回复 待解决