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 62bb646cab859cbe9d0583c05f383ac2557f5d03..1156de8c04b8674af15e8f4fdca3bd0d9862bb69 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 int IsFileExist(const Uri &uri, bool &isExist); 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 0b1a7b0a614f448beb1f99f48cc6bf61e10725d0..28c11f44d0b3d783c1cd34da596508df81d138b0 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 int IsFileExist(const Uri &uri, bool &isExist) 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 5766594ddb6890f601bdb8fd364a162f15c44cd5..a9681abf9d995ddb66a7e821b93f4da58ead78dd 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 63ee7b49d5001d05ca58e6b368d1a2f64fc3480d..7cfe65ae0e5e5f9171738f55199dbc6ddc636eba 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; + int IsFileExist(const Uri &uri, bool &isExist) 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 3acf6103d781ecbfaaf6884df8067d3fb89d994c..7d42cc940151fff4ce407826e2a1c691c625d428 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(); + int IsFileExist(Uri &uri, bool &isExist); 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 554d5bb9ea43edbd42bedf43605b3c98e2db30c6..1d540557c04d0b6b99927ed64e3f0372907bbdbd 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, const int flags) = 0; @@ -50,6 +51,7 @@ public: virtual std::vector ListFile(const Uri &sourceFile) = 0; virtual std::vector GetRoots() = 0; + virtual int IsFileExist(const Uri &uri, bool &isExist) = 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 1ba07295d273b1be9b7723494bd9bc35e639c722..62d892122868143967168052912eaeae643dc71b 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; + int IsFileExist(const Uri &uri, bool &isExist) 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 3aee053a26513d9a7aa8113c3160186f7ed27f6f..8792e0489409d5d158dab8e9742068e36a106a7e 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_ability.cpp @@ -101,5 +101,10 @@ std::vector FileAccessExtAbility::GetRoots() std::vector vec; return vec; } + +int FileAccessExtAbility::IsFileExist(const Uri &uri, bool &isExist) +{ + return ERR_OK; +} } // 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 c230661fe7477739d57ed667f4f11de688e3c51d..9610d999c90823223c62b4edccb691c3af904a74 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,48 @@ std::vector FileAccessExtProxy::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +int FileAccessExtProxy::IsFileExist(const Uri &uri, bool &isExist) +{ + 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; + } + + if (!data.WriteBool(isExist)) { + HILOG_ERROR("fail to WriteBool isExist"); + 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 ERR_IPC_ERROR; + } + + int ret = reply.ReadInt32(); + if (ret < ERR_OK) { + HILOG_ERROR("fail to ReadInt32 ret"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + isExist = 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 dcf26327ca3fb3c18953fc888c95e0cc3cf6b91c..c0d94cd2db5b4ff74e6cef58a30c36506214c44a 100644 --- a/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp +++ b/frameworks/innerkits/file_access/src/file_access_ext_stub.cpp @@ -48,6 +48,7 @@ FileAccessExtStub::FileAccessExtStub() stubFuncMap_[CMD_RENAME] = &FileAccessExtStub::CmdRename; stubFuncMap_[CMD_LIST_FILE] = &FileAccessExtStub::CmdListFile; stubFuncMap_[CMD_GET_ROOTS] = &FileAccessExtStub::CmdGetRoots; + stubFuncMap_[CMD_IS_FILE_EXIST] = &FileAccessExtStub::CmdIsFileExist; } FileAccessExtStub::~FileAccessExtStub() @@ -384,6 +385,40 @@ 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 ERR_INVALID_URI; + } + + bool isExist = data.ReadBool(); + int ret = IsFileExist(*uri, isExist); + if (ret < 0) { + HILOG_ERROR("parameter IsFileExist fail, ret is %{pubilc}d", ret); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("IsFIleExist fail "); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + if (!reply.WriteBool(isExist)) { + HILOG_ERROR("parameter Mkdir fail to WriteParcelable type"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_IPC_ERROR; + } + + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ERR_OK; +} + 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 cf383453e9952b7eaa091e39e7647a3879e452ba..9a6322550d57aafdf4c09f087597e953394f5613 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 @@ -145,5 +145,20 @@ std::vector FileAccessExtStubImpl::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +int FileAccessExtStubImpl::IsFileExist(const Uri &uri, bool &isExist) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + int ret = ERR_ERROR; + if (extension_ == nullptr) { + HILOG_ERROR("IsFileExist get extension failed."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + ret = extension_->IsFileExist(uri, isExist); + 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 958a1fd1bc42a7fb5fcdf7d0fdfcd1748ebda7d8..6e4eb1bdc08e06cc06ca729afadc49ce7a51bbc3 100644 --- a/frameworks/innerkits/file_access/src/file_access_helper.cpp +++ b/frameworks/innerkits/file_access/src/file_access_helper.cpp @@ -272,6 +272,22 @@ std::vector FileAccessHelper::GetRoots() return results; } +int FileAccessHelper::IsFileExist(Uri &uri, bool &isExist) +{ + StartTrace(HITRACE_TAG_FILEMANAGEMENT, "IsFileExist"); + int ret = ERR_ERROR; + + if (!GetProxy()) { + HILOG_ERROR("failed with invalid fileAccessExtProxy_"); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + ret = fileAccessExtProxy_->IsFileExist(uri, isExist); + 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 4dc21c9b86ce84c608a4b8e9ab47db029b8605af..172b356c37cef26c0e63b61673c6851b74d02165 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 @@ -504,5 +504,35 @@ std::vector JsFileAccessExtAbility::GetRoots() FinishTrace(HITRACE_TAG_FILEMANAGEMENT); return vec; } + +int JsFileAccessExtAbility::IsFileExist(const Uri &uri, bool &isExist) +{ + 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); + int ret = ERR_ERROR; + if (nativeResult == nullptr) { + HILOG_ERROR("call isFileExist with return null."); + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + if (!OHOS::AppExecFwk::UnwrapBoolFromJS2(env, reinterpret_cast(nativeResult), isExist)) { + FinishTrace(HITRACE_TAG_FILEMANAGEMENT); + return ret; + } + + ret = NO_ERROR; + + 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..2abb40b043e2e26cf463f1db1df20618a1a545f5 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,55 @@ 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); + bool isExist = false; + int ret = fileAccessHelper->IsFileExist(uri, isExist); + *result = isExist; + return NError(ret); + }; + auto cbComplete = [result](napi_env env, NError err) -> NVal { + if (err) { + return { env, err.GetNapiErr(env) }; + } + return { NVal::CreateBool(env, *result) }; + }; + + const std::string procedureName = "isFileExist"; + 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)) { + NError(EINVAL).ThrowErr(env, "not function type"); + return nullptr; + } + return NAsyncWorkCallback(env, thisVar, cb).Schedule(procedureName, cbExec, cbComplete).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 3436517d95742b8c771268227e308afe1eb93466..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 // 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 a1dfd5e25e16d0cc6b8dbd2f7c28275fe8532abf..17c5a70815585d4f0d74ada8982aa8794f491103 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 @@ -163,6 +163,9 @@ export default class FileExtAbility extends Extension { } try { let newFileUri = this.genNewFileUri(parentUri, displayName); + if (this.isFileExist(newFileUri)) { + return ''; + } let path = this.getPath(newFileUri); fileio.openSync(path, CREATE_FILE_FLAGS, DEFAULT_MODE); return newFileUri; @@ -309,6 +312,20 @@ 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) { + hilog.error(DOMAIN_CODE, TAG, 'isFileExist error ' + e.message); + return false; + } + return true; + } + listFile(sourceFileUri) { if (!this.checkUri(sourceFileUri)) { return [];