diff --git a/frameworks/innerkits/file_access/include/file_access_ext_ability.h b/frameworks/innerkits/file_access/include/file_access_ext_ability.h index ffc0b19dcfde2d51daf8109641b1509aaa8d9ccf..48b76661a78dbb1ad2feaa8ead48951146985b51 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_ability.h @@ -48,6 +48,7 @@ public: virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile); virtual std::vector ListFile(const Uri &sourceFile); + virtual std::vector File(const FileInfo &fileInfo); virtual std::vector GetRoots(); virtual int IsFileExist(const Uri &uri, bool &isExist); virtual int RegisterNotify(sptr ¬ify); diff --git a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h index ff4e0872773e9f0b1ed44fa934051c29a7054388..5f43d198824d82f63a3d3879913b7d34040cf7e8 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h @@ -44,6 +44,7 @@ public: virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; virtual std::vector ListFile(const Uri &sourceFile) override; + virtual std::vector File(const FileInfo &fileInfo) override; virtual std::vector GetRoots() override; virtual int IsFileExist(const Uri &uri, bool &isExist) override; virtual int RegisterNotify(sptr ¬ify) override; diff --git a/frameworks/innerkits/file_access/include/file_access_ext_stub.h b/frameworks/innerkits/file_access/include/file_access_ext_stub.h index 8893926e3baac7920faf863f8fb3e075df259e0e..20ae3dc8dadb530e1d74356f76053b4b8d4a8518 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub.h @@ -42,6 +42,7 @@ private: ErrCode CmdMove(MessageParcel &data, MessageParcel &reply); ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); + ErrCode CmdFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetRoots(MessageParcel &data, MessageParcel &reply); ErrCode CmdIsFileExist(MessageParcel &data, MessageParcel &reply); ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); diff --git a/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h b/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h index d72745dd30eea65f13052bb68d59b0f6e2427700..a287c6f8761f6dab84e560926a9a1d3d1802fe0f 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub_impl.h @@ -41,6 +41,7 @@ public: int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFileUri) override; + std::vector File(const FileInfo &fileInfo) override; std::vector GetRoots() override; int IsFileExist(const Uri &uri, bool &isExist) override; int RegisterNotify(sptr ¬ify) override; diff --git a/frameworks/innerkits/file_access/include/file_access_extension_info.h b/frameworks/innerkits/file_access/include/file_access_extension_info.h index ab4719dbb241a0b4666e5f57b476693e4a05b255..952f4da50dea01521b826399483e83817df0f6f2 100644 --- a/frameworks/innerkits/file_access/include/file_access_extension_info.h +++ b/frameworks/innerkits/file_access/include/file_access_extension_info.h @@ -34,8 +34,12 @@ enum DeviceType { DEVICE_EXTERNAL_CLOUD // Cloud disk device }; -struct FileInfo : public virtual OHOS::Parcelable { +class FileInfo : public virtual OHOS::Parcelable { public: + FileInfo() {}; + FileInfo(Uri uri_, std::string fileName_, std::string mode_, int64_t size_, int64_t mtime_, std::string mimeType_) + :uri(uri_), fileName(fileName_) , mode(mode_) , size(size_) , mtime(mtime_), mimeType(mimeType_) {}; + ~FileInfo() {}; Uri uri = Uri(""); std::string fileName; std::string mode; diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index 39a51bba113aef71b118fdaac65af80e4df27736..5e51c054267332c193fa25d9dcd486dda4e68a18 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -66,6 +66,7 @@ public: int Move(Uri &sourceFile, Uri &targetParent, Uri &newFile); int Rename(Uri &sourceFile, const std::string &displayName, Uri &newFile); std::vector ListFile(Uri &sourceFile); + std::vector File(FileInfo &fileInfo); std::vector GetRoots(); int On(std::shared_ptr &callback); int Off(); diff --git a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h index 63ab8bfd778b3b407d03ecc51e7bbb2fffdb8d41..4fd05e1e0001ba97d2c9ce1a0bc3299ac0be0932 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -43,7 +43,8 @@ public: CMD_GET_ROOTS, CMD_IS_FILE_EXIST, CMD_REGISTER_NOTIFY, - CMD_UNREGISTER_NOTIFY + CMD_UNREGISTER_NOTIFY, + CMD_FILE }; virtual int OpenFile(const Uri &uri, const int flags) = 0; @@ -54,6 +55,7 @@ public: virtual int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) = 0; virtual std::vector ListFile(const Uri &sourceFile) = 0; + virtual std::vector File(const FileInfo &fileInfo) = 0; virtual std::vector GetRoots() = 0; virtual int IsFileExist(const Uri &uri, bool &isExist) = 0; virtual int RegisterNotify(sptr ¬ify) = 0; diff --git a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h index 66d4a8f27976fa1f008d04a2fb808dad4907553e..eae34b76312b12deabe9187de4db7f97a15110e2 100644 --- a/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h +++ b/frameworks/innerkits/file_access/include/js_file_access_ext_ability.h @@ -67,6 +67,7 @@ public: int Move(const Uri &sourceFile, const Uri &targetParent, Uri &newFile) override; int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFile) override; + std::vector File(const FileInfo &fileInfo) override; std::vector GetRoots() override; int IsFileExist(const Uri &uri, bool &isExist) override; diff --git a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp index cc674d2ba623c2a62acdde562cf0676896911811..cccbd38ceccf06f9776a79dd5cc0e5bdabe0d388 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -97,6 +97,12 @@ std::vector FileAccessExtAbility::ListFile(const Uri &sourceFile) return vec; } +std::vector FileAccessExtAbility::File(const FileInfo &fileInfo) +{ + std::vector vec; + return vec; +} + std::vector FileAccessExtAbility::GetRoots() { std::vector vec; diff --git a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp index 1f5d7370e635d45cb9b199d12b293a5937745a43..f2f331504b7c276f85cf7fa454cb7da2ca49fe4d 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -366,6 +366,45 @@ std::vector FileAccessExtProxy::ListFile(const Uri &sourceFile) return vec; } +std::vector FileAccessExtProxy::File(const FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "File"); + std::vector vec; + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; + } + + if (!data.WriteParcelable(&fileInfo)) { + HILOG_ERROR("fail to WriteParcelable fileInfo"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_FILE, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; + } + + vec.clear(); + int64_t count = reply.ReadInt64(); + for (int32_t i = 0; i < count; i++) { + std::unique_ptr fileInfo(reply.ReadParcelable()); + if (fileInfo != nullptr) { + vec.push_back(*fileInfo); + } + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; +} + std::vector FileAccessExtProxy::GetRoots() { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); diff --git a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp index 2884e2e72b0547774719c3af54c2594a92f9a93e..78cfac0dcd979f741e14b8a128cc113285b23cc0 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -47,6 +47,7 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_MOVE] = &FileAccessExtStub::CmdMove; stubFuncMap_[CMD_RENAME] = &FileAccessExtStub::CmdRename; stubFuncMap_[CMD_LIST_FILE] = &FileAccessExtStub::CmdListFile; + stubFuncMap_[CMD_FILE] = &FileAccessExtStub::CmdFile; stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots; stubFuncMap_[CMD_IS_FILE_EXIST] = &FileAccessExtStub::CmdIsFileExist; stubFuncMap_[CMD_REGISTER_NOTIFY] = &FileAccessExtStub::CmdRegisterNotify; @@ -364,6 +365,36 @@ ErrCode FileAccessExtStub::CmdListFile(MessageParcel &data, MessageParcel &reply return ERR_OK; } +ErrCode FileAccessExtStub::CmdFile(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdListFile"); + std::shared_ptr fileInfo(data.ReadParcelable()); + if (fileInfo == nullptr) { + HILOG_ERROR("parameter File uri is nullptr"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_INVALID_URI; + } + + std::vector vec = File(*fileInfo); + uint64_t count {vec.size()}; + if (!reply.WriteUint64(count)) { + HILOG_ERROR("parameter ListFile fail to WriteInt32 count"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + for (uint64_t i = 0; i < count; i++) { + if (!reply.WriteParcelable(&vec[i])) { + HILOG_ERROR("parameter ListFile fail to WriteParcelable vec"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply) { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdGetRoots"); diff --git a/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp b/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp index 473747d38d0fb97823178257c63f15ce5e9c34b9..534e13347bcba9161fa248a43c9064b43829ce13 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub_impl.cpp @@ -125,6 +125,21 @@ std::vector FileAccessExtStubImpl::ListFile(const Uri &sourceFile) return vec; } +std::vector FileAccessExtStubImpl::File(const FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); + std::vector vec; + if (extension_ == nullptr) { + HILOG_ERROR("ListFile get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; + } + + vec = extension_->File(fileInfo); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return vec; +} + std::vector FileAccessExtStubImpl::GetRoots() { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index c662d2accedb003d786e0a89ad618f89de799c60..573423a78a59b444f940c1998900f04f72085c70 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -494,6 +494,21 @@ std::vector FileAccessHelper::ListFile(Uri &sourceFile) return results; } +std::vector FileAccessHelper::File(FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "ListFile"); + std::vector results; + sptr fileExtProxy = GetProxyByUri(fileInfo.uri); + if (fileExtProxy == nullptr) { + HILOG_ERROR("failed with invalid fileAccessExtProxy"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return results; + } + results = fileExtProxy->File(fileInfo); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return results; +} + std::vector FileAccessHelper::GetRoots() { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); diff --git a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp index a6e31e74b47789998d60a0d457b663a5d19fb464..f45a524b7d28ce0426098dbd68d4ef5dfa07a45c 100644 --- a/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/js_file_access_ext_ability.cpp @@ -687,6 +687,58 @@ std::vector JsFileAccessExtAbility::ListFile(const Uri &sourceFile) return value->data; } +std::vector JsFileAccessExtAbility::File(const FileInfo &fileInfo) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "File"); + auto value = std::make_shared>>(); + auto argParser = [fileInfo](NativeEngine &engine, NativeValue *argv[], size_t &argc) -> bool { + NativeValue *uri = engine.CreateString(fileInfo.uri.ToString().c_str(), fileInfo.uri.ToString().length()); + if (uri == nullptr) { + HILOG_ERROR("create sourceFile uri native js value fail."); + return false; + } + argv[ARGC_ZERO] = uri; + argc = ARGC_ONE; + return true; + }; + auto retParser = [value](NativeEngine &engine, NativeValue *result) -> bool { + NativeObject *obj = ConvertNativeValueTo(result); + bool ret = ConvertFromJsValue(engine, obj->GetProperty("code"), value->code); + NativeArray *nativeArray = ConvertNativeValueTo(obj->GetProperty("infos")); + for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { + NativeValue *nativeFileInfo = nativeArray->GetElement(i); + obj = ConvertNativeValueTo(nativeFileInfo); + FileInfo fileInfo; + std::string uri; + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("uri"), uri); + fileInfo.uri = Uri(uri); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("fileName"), fileInfo.fileName); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mode"), fileInfo.mode); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("size"), fileInfo.size); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mtime"), fileInfo.mtime); + ret = ret && ConvertFromJsValue(engine, obj->GetProperty("mimeType"), fileInfo.mimeType); + if (!ret) { + HILOG_ERROR("Convert js value fail."); + return ret; + } + (value->data).emplace_back(std::move(fileInfo)); + } + return true; + }; + + auto errCode = CallJsMethod("listFile", jsRuntime_, jsObj_.get(), argParser, retParser); + if (errCode != ERR_OK) { + HILOG_ERROR("CallJsMethod error, code:%{public}d.", errCode); + } + + if (value->code != ERR_OK) { + HILOG_ERROR("fileio fail."); + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return value->data; +} + std::vector JsFileAccessExtAbility::GetRoots() { StartTrace(HITRACE_TAG_FILEMANAGEMENT, "GetRoots"); diff --git a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp index 8d24febd6e617bfc38fb4c69c72580df52aa767b..76356088371306a6b4a8efaeca0c9f027fb27922 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -210,7 +210,8 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), DECLARE_NAPI_FUNCTION("isFileExist", NAPI_IsFileExist), DECLARE_NAPI_FUNCTION("on", NAPI_On), - DECLARE_NAPI_FUNCTION("off", NAPI_Off) + DECLARE_NAPI_FUNCTION("off", NAPI_Off), + DECLARE_NAPI_FUNCTION("file", NAPI_File), }; napi_value cons = nullptr; NAPI_CALL(env, @@ -637,6 +638,110 @@ napi_value NAPI_ListFile(napi_env env, napi_callback_info info) return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; } +std::tuple> GetFileInfo(napi_env env, NFuncArg &funcArg) +{ + bool ret = false; + NVal argv(env, funcArg[NARG_POS::FIRST]); + std::unique_ptr uri; + if (argv.HasProp("uri")) { + std::tie(ret, uri, std::ignore) = argv.GetProp("uri").ToUTF8String(); + } + std::unique_ptr fileName; + if (argv.HasProp("fileName")) { + std::tie(ret, fileName, std::ignore) = argv.GetProp("fileName").ToUTF8String(); + if (!ret) { + return {false, nullptr}; + } + } + + std::unique_ptr mode; + if (argv.HasProp("mode")) { + std::tie(ret, mode, std::ignore) = argv.GetProp("mode").ToUTF8String(); + if (!ret) { + return {false, nullptr}; + } + } + + int64_t size; + if (argv.HasProp("size")) { + std::tie(ret, size) = argv.GetProp("size").ToInt64(); + if (!ret) { + return {false, nullptr}; + } + } + + int64_t mtime; + if (argv.HasProp("mtime")) { + std::tie(ret, mtime) = argv.GetProp("mtime").ToInt64(); + if (!ret) { + return {false, nullptr}; + } + } + + std::unique_ptr mimeType; + if (argv.HasProp("mimeType")) { + std::tie(ret, mimeType, std::ignore) = argv.GetProp("mimeType").ToUTF8String(); + if (!ret) { + return {false, nullptr}; + } + } + + string uriString(uri.get()); + OHOS::Uri uri1(uriString); + string fileNameString(fileName.get()); + string modeString(mode.get()); + string mimeTypeString(mimeType.get()); + + std::shared_ptr fileInfo = std::make_shared(uri1, fileNameString, modeString, size, mtime, mimeTypeString); + return {true, fileInfo}; +} + +napi_value NAPI_File(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { + NapiError(ERR_PARAM_NUMBER).ThrowErr(env); + return nullptr; + } + + bool succ = false; + std::shared_ptr fileInfo; + std::tie(succ, fileInfo) = GetFileInfo(env, funcArg); + if (!succ) { + NapiError(ERR_INVALID_PARAM).ThrowErr(env); + return nullptr; + } + + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + + auto result = std::make_shared>(); + auto cbExec = [fileInfo, result, fileAccessHelper]() -> NError { + *result = fileAccessHelper->File(*fileInfo); + return NError(ERRNO_NOERR); + }; + auto cbComplete = [result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + napi_value jsArray = WrapArrayFileInfoToJS(env, *result); + return {env, jsArray}; + }; + + const std::string procedureName = "file"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } + NVal cb(env, funcArg[NARG_POS::SECOND]); + if (!cb.TypeIs(napi_function)) { + NapiError(ERR_INVALID_PARAM).ThrowErr(env); + return nullptr; + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; +} napi_value NAPI_GetRoots(napi_env env, napi_callback_info info) { NFuncArg funcArg(env, info); diff --git a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h index b0ec4e817304f096f8bc30f4a32babee59ccc152..c8f49c9f0db901f916f7da791af3ee5719a2ee76 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -31,6 +31,7 @@ namespace FileAccessFwk { napi_value NAPI_Move(napi_env env, napi_callback_info info); napi_value NAPI_Rename(napi_env env, napi_callback_info info); napi_value NAPI_ListFile(napi_env env, napi_callback_info info); + napi_value NAPI_File(napi_env env, napi_callback_info info); napi_value NAPI_GetRoots(napi_env env, napi_callback_info info); napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info); napi_value NAPI_On(napi_env env, napi_callback_info info);