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 7689afb012fc2e765a6746b0093e6616db4b2827..609be712bc96c5a2c578fa291dd39ee7dfad32fc 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 std::vector ListFile(const Uri &sourceFile); virtual std::vector GetRoots(); + virtual bool IsFileExist(const Uri &uri); static void SetCreator(const CreatorFunc& creator); private: static CreatorFunc creator_; 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 f450951cd99889b5d71553a9738698950d599ad0..c9051094fe6df7ae58374c206871f058c1ed2f22 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_proxy.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_proxy.h @@ -45,6 +45,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile) override; virtual std::vector GetRoots() override; + virtual bool IsFileExist(const Uri &uri) override; private: static inline BrokerDelegator delegator_; }; 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 8c23289297e9d90f9cb76e57dbe13236e3037398..d4cf4fdc8409cbe3f50ac6a2bdc52c37fe5acf0c 100644 --- a/frameworks/innerkits/file_access/include/file_access_ext_stub.h +++ b/frameworks/innerkits/file_access/include/file_access_ext_stub.h @@ -43,6 +43,7 @@ private: ErrCode CmdRename(MessageParcel &data, MessageParcel &reply); ErrCode CmdListFile(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetRoots(MessageParcel &data, MessageParcel &reply); + ErrCode CmdIsFileExist(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); using RequestFuncType = int (FileAccessExtStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; 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 4ee634a0ca0c7b8f4b57d8d615d6a6fbd062379c..1a272b0a2d22e201e5c3020252de8cdafe11d41a 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 @@ -42,6 +42,7 @@ public: int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFileUri) override; std::vector GetRoots() override; + bool IsFileExist(const Uri &uri) override; private: std::shared_ptr GetOwner(); diff --git a/frameworks/innerkits/file_access/include/file_access_helper.h b/frameworks/innerkits/file_access/include/file_access_helper.h index df3899d0145fa94b4282fb63b1b7b1e42fd94675..e136d9f96469e8cc9289105899a22b7171d78985 100644 --- a/frameworks/innerkits/file_access/include/file_access_helper.h +++ b/frameworks/innerkits/file_access/include/file_access_helper.h @@ -45,6 +45,7 @@ public: bool GetProxy(); bool Release(); + bool IsFileExist(Uri &uri); int OpenFile(Uri &uri, int flags); int CreateFile(Uri &parent, const std::string &displayName, Uri &newFile); int Mkdir(Uri &parent, const std::string &displayName, Uri &newDir); 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 fdc837b8ce8d9612634cd5570e0555cb1e7845a8..75b923435c3d10dc6c3a4ae9afc180e7f3658e93 100644 --- a/frameworks/innerkits/file_access/include/ifile_access_ext_base.h +++ b/frameworks/innerkits/file_access/include/ifile_access_ext_base.h @@ -38,7 +38,8 @@ public: CMD_MOVE, CMD_RENAME, CMD_LIST_FILE, - CMD_GET_ROOTS + CMD_GET_ROOTS, + CMD_IS_FILE_EXIST }; virtual int OpenFile(const Uri &uri, int flags) = 0; @@ -50,6 +51,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile) = 0; virtual std::vector GetRoots() = 0; + virtual bool IsFileExist(const Uri &uri) = 0; }; } // namespace FileAccessFwk } // namespace OHOS 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 49d26194d18b5db388475caaae0850f78016741e..240e145dd8fc27a1315c0f70bc38a0bb8a815189 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 @@ -64,6 +64,8 @@ public: int Rename(const Uri &sourceFile, const std::string &displayName, Uri &newFile) override; std::vector ListFile(const Uri &sourceFile) override; std::vector GetRoots() override; + bool IsFileExist(const Uri &uri) override; + private: NativeValue* AsnycCallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); NativeValue* CallObjectMethod(const char *name, NativeValue * const *argv = nullptr, size_t argc = 0); 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 a570e63dfeb44e19b89cac3d42911277400e88fe..0c714597727a2e396f0d694d54a74d6bdc695cc4 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -99,5 +99,10 @@ std::vector FileAccessExtAbility::GetRoots() std::vector vec; return vec; } + +bool FileAccessExtAbility::IsFileExist(const Uri &uri) +{ + return true; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file 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 059331c8f738c43bfa6d841554d596ac6ceb9aa9..dca621823e51d0edf2e262b57d8ba9fe0d0e1110 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_proxy.cpp @@ -398,5 +398,35 @@ std::vector FileAccessExtProxy::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +bool FileAccessExtProxy::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessExtProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + if (!data.WriteParcelable(&uri)) { + HILOG_ERROR("fail to WriteParcelable uri"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + MessageParcel reply; + MessageOption option; + int32_t err = Remote()->SendRequest(CMD_IS_FILE_EXIST, data, reply, option); + if (err != NO_ERROR) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + bool ret = reply.ReadBool(); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS 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 b08878572ab402e1c714e6a14ea676d40d6a526e..cb8b855509f08fc66964cf9ff6b46f8849f1cf69 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -384,6 +384,33 @@ ErrCode FileAccessExtStub::CmdGetRoots(MessageParcel &data, MessageParcel &reply return ERR_OK; } +ErrCode FileAccessExtStub::CmdIsFileExist(MessageParcel &data, MessageParcel &reply) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "CmdIsFileExist"); + std::shared_ptr uri(data.ReadParcelable()); + if (uri == nullptr) { + HILOG_ERROR("IsFIleExist uri is nullptr"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + bool ret = IsFileExist(*uri); + if (ret == false) { + HILOG_ERROR("IsFIleExist fail"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if (!reply.WriteBool(ret)) { + HILOG_ERROR("IsFIleExist fail "); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return true; +} + bool FileAccessExtStub::CheckCallingPermission(const std::string &permission) { 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 26fd26e2976157ed40236435964b6e91bd3c8ec8..87e67954b1329d7673f641d92e31040a4f0687f6 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 @@ -153,5 +153,20 @@ std::vector FileAccessExtStubImpl::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +bool FileAccessExtStubImpl::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + bool ret = false; + if (extension_ == nullptr) { + HILOG_ERROR("IsFileExist get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + ret = extension_->IsFileExist(uri); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/frameworks/innerkits/file_access/src/file_access_helper.cpp b/frameworks/innerkits/file_access/src/file_access_helper.cpp index 9a3a497a74c6272f60f5fba99355966be7e97a64..957bc86dd9156ed53ff7c3cf8e728d1e4146d7f5 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -272,6 +272,21 @@ std::vector FileAccessHelper::GetRoots() return results; } +bool FileAccessHelper::IsFileExist(Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "OpenFile"); + bool ret = false; + if (!GetProxy()) { + HILOG_ERROR("failed with invalid fileAccessExtProxy_"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return false; + } + + ret = fileAccessExtProxy_->IsFileExist(uri); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} + void FileAccessDeathRecipient::OnRemoteDied(const wptr &remote) { if (handler_) { 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 30764f8d05040b5c9eec9b73f67c9335fc126a7d..8ff19f1090fac8843bc54817feb101600c72c187 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 @@ -501,5 +501,32 @@ std::vector JsFileAccessExtAbility::GetRoots() return vec; } } + +bool JsFileAccessExtAbility::IsFileExist(const Uri &uri) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + HandleScope handleScope(jsRuntime_); + napi_env env = reinterpret_cast(&jsRuntime_.GetNativeEngine()); + + napi_value napiUri = nullptr; + napi_create_string_utf8(env, uri.ToString().c_str(), NAPI_AUTO_LENGTH, &napiUri); + + NativeValue* nativeUri = reinterpret_cast(napiUri); + NativeValue* argv[] = {nativeUri}; + NativeValue* nativeResult = AsnycCallObjectMethod("isFileExist", argv, ARGC_ONE); + bool ret = false; + if (nativeResult == nullptr) { + HILOG_ERROR("call isFileExist with return null."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if (OHOS::AppExecFwk::UnwrapBoolFromJS2(env, reinterpret_cast(nativeResult), ret)) { + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js index 97f0eb6ab4dd5d2504a8fe46af5aa4af6232638f..4728e023f2073ffd3188f5e668b947fe43c5d948 100644 --- a/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js +++ b/interfaces/kits/napi/file_access_ext_ability/file_access_ext_ability.js @@ -50,6 +50,10 @@ class FileAccessExtensionAbility { let roots = []; return roots; } + + isFileExist() { + return true; + } } export default FileAccessExtensionAbility \ No newline at end of file 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 c8edcf9b34785e3385a7b6a1288230c0f82be584..010fac4d7c0fe639f097d3ec3865579090031327 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.cpp @@ -155,6 +155,7 @@ napi_value FileAccessHelperInit(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("rename", NAPI_Rename), DECLARE_NAPI_FUNCTION("listFile", NAPI_ListFile), DECLARE_NAPI_FUNCTION("getRoots", NAPI_GetRoots), + DECLARE_NAPI_FUNCTION("isFileExist", NAPI_IsFileExist), }; napi_value cons = nullptr; NAPI_CALL(env, @@ -599,5 +600,51 @@ napi_value NAPI_GetRoots(napi_env env, napi_callback_info info) } return NVal::CreateUndefined(env).val_; } + +napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info) +{ + NFuncArg funcArg(env, info); + if (!funcArg.InitArgs(NARG_CNT::ONE, NARG_CNT::TWO)) { + NError(EINVAL).ThrowErr(env, "Number of arguments unmatched"); + return nullptr; + } + + bool succ = false; + std::unique_ptr uri; + std::tie(succ, uri, std::ignore) = NVal(env, funcArg[NARG_POS::FIRST]).ToUTF8String(); + if (!succ) { + NError(EINVAL).ThrowErr(env, "Invalid uri"); + return nullptr; + } + + FileAccessHelper *fileAccessHelper = GetFileAccessHelper(env, funcArg.GetThisVar()); + if (fileAccessHelper == nullptr) { + return nullptr; + } + + auto result = std::make_shared(); + string uriString(uri.get()); + auto cbExec = [uriString, result, fileAccessHelper]() -> NError { + OHOS::Uri uri(uriString); + *result = fileAccessHelper->IsFileExist(uri); + return NError(ERRNO_NOERR); + }; + auto cbComplete = [result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + return { NVal::CreateBool(env, *result) }; + }; + + std::string procedureName = "isFileExist"; + NVal thisVar(env, funcArg.GetThisVar()); + if (funcArg.GetArgc() == NARG_CNT::ONE) { + return NAsyncWorkPromise(env, thisVar).Schedule(procedureName, cbExec, cbComplete).val_; + } else { + NVal cb(env, funcArg[NARG_POS::SECOND]); + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).val_; + } + return NVal::CreateUndefined(env).val_; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file 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 5f3836cea0a49df77fe61aff8d0590cbc5ca11dd..9f04a077be241445f5fa8ae47a20736278a8e43b 100644 --- a/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h +++ b/interfaces/kits/napi/file_access_module/napi_fileaccess_helper.h @@ -32,6 +32,7 @@ namespace FileAccessFwk { 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_GetRoots(napi_env env, napi_callback_info info); + napi_value NAPI_IsFileExist(napi_env env, napi_callback_info info); } } // namespace FileAccessFwk -#endif // FILE_ACCESS_NAPI_H \ No newline at end of file +#endif // NAPI_FILEACCESS_HELPER_H \ No newline at end of file diff --git a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts index a9cb36b19a095347bd4635ead25a395d19181083..51c07e2affa3cdb9c6abde8bc570044337cf1423 100644 --- a/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts +++ b/services/file_extension_hap/entry/src/main/ets/FileExtensionAbility/FileExtensionAbility.ts @@ -308,6 +308,19 @@ export default class FileExtAbility extends Extension { } } + isFileExist(sourceFileUri) { + if (!this.checkUri(sourceFileUri)) { + return false; + } + try { + let path = this.getPath(sourceFileUri); + fileio.accessSync(path); + } catch (e) { + return false; + } + return true; + } + listFile(sourceFileUri) { if (!this.checkUri(sourceFileUri)) { return [];