diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.cpp b/interfaces/kits/js/src/mod_fs/properties/copy.cpp index 678dda4b92bb331d0ef558b968f28cc42f2ea11c..283888ed314383b579117ce0f154d9e3b9e66146 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/copy.cpp @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -249,6 +249,13 @@ static void Deleter(struct NameList *arg) free(arg->namelist); } +void Copy::GetRealPath(string &path) +{ + unique_ptr absPath = make_unique(PATH_MAX + 1); + realpath(path.c_str(),absPath.get()); + path = absPath.get(); +} + uint64_t Copy::GetDirSize(std::shared_ptr infos, std::string path) { unique_ptr pNameList = { new (nothrow) struct NameList, Deleter }; @@ -322,8 +329,8 @@ int Copy::CopyDirFunc(const string &src, const string &dest, std::shared_ptr infos, std::shared_ptr callback) { - if (infos->srcPath == infos->destPath) { - HILOGE("The src and dest are the same."); + if (infos->destPath.find(infos->srcPath) != std::string::npos) { + HILOGE("The src directory is the subdirectory of dest"); return EINVAL; } if (IsFile(infos->srcPath)) { @@ -671,6 +678,8 @@ tuple> Copy::CreateFileInfos( infos->listener = listener; infos->srcPath = ConvertUriToPath(infos->srcUri); infos->destPath = ConvertUriToPath(infos->destUri); + GetRealPath(infos->destPath); + GetRealPath(infos->srcPath); infos->notifyTime = std::chrono::steady_clock::now() + NOTIFY_PROGRESS_DELAY; if (listener) { infos->hasListener = true; diff --git a/interfaces/kits/js/src/mod_fs/properties/copy.h b/interfaces/kits/js/src/mod_fs/properties/copy.h index dc792fa968a262dab4777c9933d6aa5ceb1c4ac7..22e55f87eee020bcea415165123ec31eaea8e86d 100644 --- a/interfaces/kits/js/src/mod_fs/properties/copy.h +++ b/interfaces/kits/js/src/mod_fs/properties/copy.h @@ -93,7 +93,7 @@ struct FileInfos { if (srcUri == infos.srcUri) { return destUri < infos.destUri; } - return (srcUri < infos.srcUri || destUri < infos.destUri); + return srcUri < infos.srcUri; } }; @@ -165,6 +165,7 @@ private: static bool IsDirectory(const std::string &path); static bool IsFile(const std::string &path); static std::string ConvertUriToPath(const std::string &uri); + static void GetRealPath(string &path); }; } // namespace ModuleFileIO } // namespace FileManagement