From e6fc774741212293533a3af23845a2474d1a66b9 Mon Sep 17 00:00:00 2001 From: fengjunqing Date: Fri, 7 Apr 2023 17:20:39 +0800 Subject: [PATCH] Modefied listFile code Signed-off-by: fengjunqing --- .vscode/settings.json | 13 ++ .../js/src/mod_fs/properties/listfile.cpp | 154 +++++++----------- .../kits/js/src/mod_fs/properties/listfile.h | 10 -- 3 files changed, 75 insertions(+), 102 deletions(-) create mode 100644 .vscode/settings.json mode change 100755 => 100644 interfaces/kits/js/src/mod_fs/properties/listfile.cpp diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..39b99c1e7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "files.associations": { + "*.ets": "javascript", + "filesystem": "cpp", + "array": "cpp", + "*.tcc": "cpp", + "memory": "cpp", + "istream": "cpp", + "functional": "cpp", + "tuple": "cpp", + "utility": "cpp" + } +} \ No newline at end of file diff --git a/interfaces/kits/js/src/mod_fs/properties/listfile.cpp b/interfaces/kits/js/src/mod_fs/properties/listfile.cpp old mode 100755 new mode 100644 index 6468c964c..08d1fdf43 --- a/interfaces/kits/js/src/mod_fs/properties/listfile.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/listfile.cpp @@ -15,6 +15,7 @@ #include "listfile.h" +#include #include #include #include @@ -50,12 +51,12 @@ static bool CheckSuffix(const vector &suffixs) return true; } -static bool GetFileFilterParam(const NVal &argv, OHOS::DistributedFS::FileFilter *filter) +static bool GetFileFilterParam(const NVal &opFilter, OHOS::DistributedFS::FileFilter &filter) { bool ret = false; - if (argv.HasProp("suffix") && !argv.GetProp("suffix").TypeIs(napi_undefined)) { + if (opFilter.HasProp("suffix") && !opFilter.GetProp("suffix").TypeIs(napi_undefined)) { vector suffixs; - tie(ret, suffixs, ignore) = argv.GetProp("suffix").ToStringArray(); + tie(ret, suffixs, ignore) = opFilter.GetProp("suffix").ToStringArray(); if (!ret) { HILOGE("Failed to get suffix prop."); return false; @@ -64,11 +65,11 @@ static bool GetFileFilterParam(const NVal &argv, OHOS::DistributedFS::FileFilter HILOGE("Invalid suffix."); return false; } - filter->SetSuffix(suffixs); + filter.SetSuffix(suffixs); } - if (argv.HasProp("displayName") && !argv.GetProp("displayName").TypeIs(napi_undefined)) { + if (opFilter.HasProp("displayName") && !opFilter.GetProp("displayName").TypeIs(napi_undefined)) { vector displayNames; - tie(ret, displayNames, ignore) = argv.GetProp("displayName").ToStringArray(); + tie(ret, displayNames, ignore) = opFilter.GetProp("displayName").ToStringArray(); if (!ret) { HILOGE("Failed to get displayname prop."); return false; @@ -77,25 +78,25 @@ static bool GetFileFilterParam(const NVal &argv, OHOS::DistributedFS::FileFilter HILOGE("Invalid displayName."); return false; } - filter->SetDisplayName(displayNames); + filter.SetDisplayName(displayNames); } - if (argv.HasProp("fileSizeOver") && !argv.GetProp("fileSizeOver").TypeIs(napi_undefined)) { - int64_t fileSizeOver; - tie(ret, fileSizeOver) = argv.GetProp("fileSizeOver").ToInt64(); + if (opFilter.HasProp("fileSizeOver") && !opFilter.GetProp("fileSizeOver").TypeIs(napi_undefined)) { + int64_t fileSizeOver = 0; + tie(ret, fileSizeOver) = opFilter.GetProp("fileSizeOver").ToInt64(); if (!ret || fileSizeOver < 0) { HILOGE("Failed to get fileSizeOver prop."); return false; } - filter->SetFileSizeOver(fileSizeOver); + filter.SetFileSizeOver(fileSizeOver); } - if (argv.HasProp("lastModifiedAfter") && !argv.GetProp("lastModifiedAfter").TypeIs(napi_undefined)) { - double lastModifiedAfter; - tie(ret, lastModifiedAfter) = argv.GetProp("lastModifiedAfter").ToDouble(); + if (opFilter.HasProp("lastModifiedAfter") && !opFilter.GetProp("lastModifiedAfter").TypeIs(napi_undefined)) { + double lastModifiedAfter = 0; + tie(ret, lastModifiedAfter) = opFilter.GetProp("lastModifiedAfter").ToDouble(); if (!ret || lastModifiedAfter < 0) { HILOGE("Failed to get lastModifiedAfter prop."); return false; } - filter->SetLastModifiedAfter(lastModifiedAfter); + filter.SetLastModifiedAfter(lastModifiedAfter); } return true; } @@ -122,7 +123,7 @@ static bool GetOptionParam(const NVal &argv, OptionArgs *optionArgs) if (argv.HasProp("filter")) { NVal filterProp = argv.GetProp("filter"); if (!filterProp.TypeIs(napi_undefined)) { - auto ret = GetFileFilterParam(filterProp, &optionArgs->filter); + auto ret = GetFileFilterParam(filterProp, optionArgs->filter); if (!ret) { HILOGE("Failed to get filter prop."); return false; @@ -149,7 +150,7 @@ static bool GetOptionArg(napi_env env, const NFuncArg &funcArg, OptionArgs &opti return false; } -static bool FilterSuffix(const vector& suffixs, const struct dirent& filename) +static bool FilterSuffix(const vector &suffixs, const struct dirent &filename) { if (filename.d_type == DT_DIR) { return true; @@ -167,10 +168,10 @@ static bool FilterSuffix(const vector& suffixs, const struct dirent& fil return false; } -static bool FilterDisplayname(const vector& displaynames, const struct dirent& filename) +static bool FilterDisplayName(const vector &displayNames, const string &fileName) { - for (const auto &iter : displaynames) { - int ret = fnmatch(iter.c_str(), filename.d_name, FNM_PATHNAME | FNM_PERIOD); + for (const auto &iter : displayNames) { + int ret = fnmatch(iter.c_str(), fileName.c_str(), FNM_PATHNAME | FNM_PERIOD); if (ret == 0) { return true; } @@ -178,10 +179,10 @@ static bool FilterDisplayname(const vector& displaynames, const struct d return false; } -static bool FilterFilesizeOver(const int64_t fFileSizeOver, const struct dirent& filename) +static bool FilterFileSizeOver(const int64_t fFileSizeOver, const string &fileName) { struct stat info; - string stPath = (g_optionArgs.path + '/' + string(filename.d_name)); + string stPath = g_optionArgs.path + '/' + fileName; int32_t res = stat(stPath.c_str(), &info); if (res != 0) { HILOGE("Failed to stat file."); @@ -193,10 +194,10 @@ static bool FilterFilesizeOver(const int64_t fFileSizeOver, const struct dirent& return true; } -static bool FilterLastModifyTime(const double lastModifiedAfter, const struct dirent& filename) +static bool FilterLastModifyTime(const double lastModifiedAfter, const string &fileName) { struct stat info; - string stPath = g_optionArgs.path + '/' + string(filename.d_name); + string stPath = g_optionArgs.path + '/' + fileName; int32_t res = stat(stPath.c_str(), &info); if (res != 0) { HILOGE("Failed to stat file."); @@ -208,22 +209,22 @@ static bool FilterLastModifyTime(const double lastModifiedAfter, const struct di return true; } -static bool FilterResult(const struct dirent &filename) +static bool FilterResult(const struct dirent &fileName) { vector fSuffixs = g_optionArgs.filter.GetSuffix(); - if (!FilterSuffix(fSuffixs, filename) && fSuffixs.size() > 0) { + if (!FilterSuffix(fSuffixs, fileName) && fSuffixs.size() > 0) { return false; } - vector fDisplaynames = g_optionArgs.filter.GetDisplayName(); - if (!FilterDisplayname(fDisplaynames, filename) && fDisplaynames.size() > 0) { + vector fDisplayNames = g_optionArgs.filter.GetDisplayName(); + if (!FilterDisplayName(fDisplayNames, string(fileName.d_name)) && fDisplayNames.size() > 0) { return false; } int64_t fFileSizeOver = g_optionArgs.filter.GetFileSizeOver(); - if (!FilterFilesizeOver(fFileSizeOver, filename) && fFileSizeOver > 0) { + if (!FilterFileSizeOver(fFileSizeOver, string(fileName.d_name)) && fFileSizeOver > 0) { return false; } double fLastModifiedAfter = g_optionArgs.filter.GetLastModifiedAfter(); - if (!FilterLastModifyTime(fLastModifiedAfter, filename) && fLastModifiedAfter > 0) { + if (!FilterLastModifyTime(fLastModifiedAfter, string(fileName.d_name)) && fLastModifiedAfter > 0) { return false; } g_optionArgs.countNum++; @@ -244,58 +245,33 @@ static int32_t FilterFunc(const struct dirent *filename) return FILTER_DISMATCH; } -static vector FilterFileRes(const string &path) +struct NameList { + struct dirent** namelist = { nullptr }; + int direntNum = 0; +}; + +static void Deletor(struct NameList *arg) { - struct dirent** namelist; - int num = scandir(path.c_str(), &(namelist), FilterFunc, alphasort); - vector dirents; - for (int i = 0; i < num; i++) { - struct dirent tmpDirent; - if (EOK == memcpy_s(&tmpDirent, sizeof(dirent), namelist[i], namelist[i]->d_reclen)) { - dirents.emplace_back(tmpDirent); - } - free(namelist[i]); + for (int i = 0; i < arg->direntNum; i++) { + delete (arg->namelist)[i]; + (arg->namelist)[i] = nullptr; } - free(namelist); - return dirents; } -static void RecursiveFunc(const string &path, vector &dirents) +static void FilterFileRes(const string &path, shared_ptr> resList) { - struct dirent** namelist; - int num = scandir(path.c_str(), &(namelist), FilterFunc, alphasort); + unique_ptr nameListPtr = {new (nothrow) struct NameList, Deletor}; + int num = scandir(path.c_str(), &(nameListPtr->namelist), FilterFunc, alphasort); for (int i = 0; i < num; i++) { - if ((*namelist[i]).d_type == DT_REG) { - struct dirent tmpDirent; - if (EOK == memcpy_s(&tmpDirent, sizeof(dirent), namelist[i], namelist[i]->d_reclen)) { - dirents.emplace_back(tmpDirent); - } - } else if ((*(namelist)[i]).d_type == DT_DIR) { + if (g_optionArgs.recursion && (nameListPtr->namelist[i]->d_type == DT_DIR)) { string pathTemp = g_optionArgs.path; - g_optionArgs.path += '/' + string((*namelist[i]).d_name); - RecursiveFunc(g_optionArgs.path, dirents); + g_optionArgs.path += '/' + string(nameListPtr->namelist[i]->d_name); + FilterFileRes(g_optionArgs.path, resList); g_optionArgs.path = pathTemp; + } else { + string involvePathName = g_optionArgs.path + '/' + string(nameListPtr->namelist[i]->d_name); + resList->emplace_back(involvePathName); } - free(namelist[i]); - } - free(namelist); -} - -static napi_value DoListFileVector2NV(napi_env env, vector &dirents) -{ - vector strs; - for (size_t i = 0; i < dirents.size(); i++) { - strs.emplace_back(dirents[i].d_name); - } - return NVal::CreateArrayString(env, strs).val_; -} - -static NVal DoListFileCompile(napi_env env, NError err, shared_ptr arg) -{ - if (err) { - return { env, err.GetNapiErr(env) }; - } else { - return { env, DoListFileVector2NV(env, arg->dirents) }; } } @@ -307,8 +283,9 @@ napi_value ListFile::Sync(napi_env env, napi_callback_info info) NError(EINVAL).ThrowErr(env); return nullptr; } + auto [succPath, path, unused] = NVal(env, funcArg[NARG_POS::FIRST]).ToUTF8String(); - if (!succPath) { + if (!succPath || !filesystem::is_directory(filesystem::status(path.get()))) { HILOGE("Invalid path"); NError(EINVAL).ThrowErr(env); return nullptr; @@ -318,14 +295,11 @@ napi_value ListFile::Sync(napi_env env, napi_callback_info info) NError(EINVAL).ThrowErr(env); return nullptr; } - vector direntsRes; - if (g_optionArgs.recursion) { - RecursiveFunc(path.get(), direntsRes); - } else { - direntsRes = FilterFileRes(path.get()); - } + + auto direntsRes = make_shared>(); + FilterFileRes(path.get(), direntsRes); g_optionArgs.Clear(); - return DoListFileVector2NV(env, direntsRes); + return NVal::CreateArrayString(env, *direntsRes).val_; } napi_value ListFile::Async(napi_env env, napi_callback_info info) @@ -351,29 +325,25 @@ napi_value ListFile::Async(napi_env env, napi_callback_info info) return nullptr; } - auto arg = make_shared(); - if (!arg) { + auto direntsRes = make_shared>(); + if (!direntsRes) { HILOGE("Failed to request heap memory."); NError(ENOMEM).ThrowErr(env); return nullptr; } - - auto cbExec = [arg, optionArgsTmp]() -> NError { + auto cbExec = [direntsRes, optionArgsTmp]() -> NError { g_optionArgs = optionArgsTmp; - if (g_optionArgs.recursion) { - RecursiveFunc(g_optionArgs.path, arg->dirents); - } else { - arg->dirents = FilterFileRes(g_optionArgs.path); - } + FilterFileRes(g_optionArgs.path, direntsRes); g_optionArgs.Clear(); return NError(ERRNO_NOERR); }; - auto cbCompl = [arg](napi_env env, NError err) -> NVal { + auto cbCompl = [direntsRes](napi_env env, NError err) -> NVal { if (err) { return { env, err.GetNapiErr(env) }; + } else { + return { NVal::CreateArrayString(env, *direntsRes) }; } - return DoListFileCompile(env, err, arg); }; NVal thisVar(env, funcArg.GetThisVar()); diff --git a/interfaces/kits/js/src/mod_fs/properties/listfile.h b/interfaces/kits/js/src/mod_fs/properties/listfile.h index f7d4028e3..18d931baf 100755 --- a/interfaces/kits/js/src/mod_fs/properties/listfile.h +++ b/interfaces/kits/js/src/mod_fs/properties/listfile.h @@ -29,16 +29,6 @@ public: static napi_value Async(napi_env env, napi_callback_info info); }; -class ListFileArgs { -public: - std::vector dirents; - explicit ListFileArgs() - { - dirents = std::vector(); - } - ~ListFileArgs() = default; -}; - struct OptionArgs { OHOS::DistributedFS::FileFilter filter = { {}, {}, {}, 0, 0, false, false }; int listNum = 0; -- Gitee