From 4d608e20fda87b9ea164924f1b4db76dc7d35590 Mon Sep 17 00:00:00 2001 From: gwx1278443 Date: Fri, 13 Oct 2023 09:12:56 +0800 Subject: [PATCH] Move_Dir Signed-off-by: gwx1278443 --- .../kits/js/src/mod_fs/properties/movedir.cpp | 85 +++++++++++-------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/interfaces/kits/js/src/mod_fs/properties/movedir.cpp b/interfaces/kits/js/src/mod_fs/properties/movedir.cpp index 6f845c17d..4b6856419 100644 --- a/interfaces/kits/js/src/mod_fs/properties/movedir.cpp +++ b/interfaces/kits/js/src/mod_fs/properties/movedir.cpp @@ -97,19 +97,39 @@ static tuple, unique_ptr, int> ParseJsOperand(n return { true, move(src), move(dest), mode }; } -static int CopyAndDeleteFile(const string &src, const string &dest) -{ +static int RestoreDirMtime(const string &srcPath, const string &destPath) +{ std::unique_ptr stat_req = { new (std::nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; if (!stat_req) { HILOGE("Failed to request heap memory."); return ENOMEM; } - int ret = uv_fs_stat(nullptr, stat_req.get(), src.c_str(), nullptr); + int ret = uv_fs_stat(nullptr, stat_req.get(), srcPath.c_str(), nullptr); if (ret < 0) { HILOGE("Failed to stat srcPath"); + return ret; + } + double atime = static_cast(stat_req->statbuf.st_atim.tv_sec) + + static_cast(stat_req->statbuf.st_atim.tv_nsec) / NS; + double mtime = static_cast(stat_req->statbuf.st_mtim.tv_sec) + + static_cast(stat_req->statbuf.st_mtim.tv_nsec) / NS; + std::unique_ptr utime_req = { + new (std::nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; + if (!utime_req) { + HILOGE("Failed to request heap memory."); + return ENOMEM; + } + ret = uv_fs_utime(nullptr, utime_req.get(), destPath.c_str(), atime, mtime, nullptr); + if (ret < 0) { + HILOGE("Failed to utime %s, error code: %d", destPath.c_str(), ret); return ret; } + return ERRNO_NOERR; +} + +static int CopyAndDeleteFile(const string &src, const string &dest) +{ filesystem::path dstPath(dest); if (filesystem::exists(dstPath)) { int removeRes = RemovePath(dest); @@ -124,18 +144,8 @@ static int CopyAndDeleteFile(const string &src, const string &dest) HILOGE("Failed to copy file, error code: %{public}d", errCode.value()); return errCode.value(); } - std::unique_ptr utime_req = { - new (std::nothrow) uv_fs_t, CommonFunc::fs_req_cleanup }; - if (!utime_req) { - HILOGE("Failed to request heap memory."); - return ENOMEM; - } - double atime = static_cast(stat_req->statbuf.st_atim.tv_sec) + - static_cast(stat_req->statbuf.st_atim.tv_nsec) / NS; - double mtime = static_cast(stat_req->statbuf.st_mtim.tv_sec) + - static_cast(stat_req->statbuf.st_mtim.tv_nsec) / NS; - ret = uv_fs_utime(nullptr, utime_req.get(), dstPath.c_str(), atime, mtime, nullptr); - if (ret < 0) { + int ret = RestoreDirMtime(srcPath, dstPath); + if (ret) { HILOGE("Failed to utime dstPath"); return ret; } @@ -169,32 +179,39 @@ static int32_t FilterFunc(const struct dirent *filename) return FILE_MATCH; } -static int RenameDir(const string &src, const string &dest, const int mode, vector &errfiles) -{ +static int RenameDir(const string &src, const string &dest, const int mode, vector &errfiles) { filesystem::path destPath(dest); - if (!filesystem::exists(destPath)) { - filesystem::path srcPath(src); - std::error_code errCode; - filesystem::rename(srcPath, destPath, errCode); - if (errCode.value() == EXDEV) { - HILOGE("Failed to rename file due to EXDEV"); - if (filesystem::create_directory(destPath, errCode)) { - return RecurMoveDir(src, dest, mode, errfiles); - } else { - HILOGE("Failed to create directory, error code: %{public}d", errCode.value()); - return errCode.value(); - } - } - if (errCode.value() != 0) { - HILOGE("Failed to rename file, error code: %{public}d", errCode.value()); + if (filesystem::exists(destPath)) { + return RecurMoveDir(src, dest, mode, errfiles); + } + + filesystem::path srcPath(src); + std::error_code errCode; + filesystem::rename(srcPath, destPath, errCode); + + if (errCode.value() == EXDEV) { + HILOGE("Failed to rename file due to EXDEV"); + if (!filesystem::create_directory(destPath, errCode)) { + HILOGE("Failed to create directory, error code: %{public}d", errCode.value()); return errCode.value(); } - } else { - return RecurMoveDir(src, dest, mode, errfiles); + + int ret = RestoreDirMtime(srcPath, destPath); + if (ret) { + HILOGE("Failed to utime dstPath"); + } + return ret; + } + + if (errCode.value() != 0) { + HILOGE("Failed to rename file, error code: %{public}d", errCode.value()); + return errCode.value(); } + return ERRNO_NOERR; } + struct NameListArg { struct dirent** namelist; int num; -- Gitee