diff --git a/frameworks/native/distributed_file_inner/include/copy/file_copy_listener.h b/frameworks/native/distributed_file_inner/include/copy/file_copy_listener.h index d755452b0896a2277595efdc32fcfa2d40a3ffc7..b951388d5db5957a984454bba59a5b603f1aa93a 100644 --- a/frameworks/native/distributed_file_inner/include/copy/file_copy_listener.h +++ b/frameworks/native/distributed_file_inner/include/copy/file_copy_listener.h @@ -62,6 +62,7 @@ public: return filePaths_; } int32_t GetResult() { return errorCode_; }; + uint64_t GetFileSize() { return totalSize_; }; private: void CloseNotifyFd(); diff --git a/frameworks/native/distributed_file_inner/include/copy/file_size_utils.h b/frameworks/native/distributed_file_inner/include/copy/file_size_utils.h index 04b1763ef2199d94d6d1da0d92e97c3ba057f96b..7d6205e1d834fa9daff4ff379bdf6ff235105651 100644 --- a/frameworks/native/distributed_file_inner/include/copy/file_size_utils.h +++ b/frameworks/native/distributed_file_inner/include/copy/file_size_utils.h @@ -44,7 +44,8 @@ public: static bool IsFilePathValid(const std::string &filePath); static int32_t IsFile(const std::string &path, bool &result); static int32_t IsDirectory(const std::string &path, bool &result); - + static std::string CalculateSpeed(uint64_t fileSize, uint64_t speedTimeMs); + private: static int FilterFunc(const struct dirent *filename); static std::string GetRealPath(const std::string &path); diff --git a/frameworks/native/distributed_file_inner/src/copy/file_copy_manager.cpp b/frameworks/native/distributed_file_inner/src/copy/file_copy_manager.cpp index 3e5c7e5a61fbaa7293eeb02c41cd83033ba2e5b4..f0b37b1f9ca459d93032da5027eae08020506006 100644 --- a/frameworks/native/distributed_file_inner/src/copy/file_copy_manager.cpp +++ b/frameworks/native/distributed_file_inner/src/copy/file_copy_manager.cpp @@ -371,6 +371,7 @@ int32_t FileCopyManager::ExecCopy(std::shared_ptr infos) int32_t FileCopyManager::ExecLocal(std::shared_ptr infos) { + auto startTime = std::chrono::system_clock::now(); LOGI("start ExecLocal"); if (infos == nullptr || infos->localListener == nullptr) { LOGE("infos or localListener is nullptr"); @@ -393,7 +394,14 @@ int32_t FileCopyManager::ExecLocal(std::shared_ptr infos) return ret; } infos->localListener->StartListener(); - return ExecCopy(infos); + ret = ExecCopy(infos); + auto endTime = std::chrono::system_clock::now(); + uint64_t spendTime = std::chrono::duration_cast(endTime - startTime).count(); + uint64_t fileSize = infos->localListener->GetFileSize(); + std::string speed = FileSizeUtils::CalculateSpeed(fileSize, spendTime); + LOGI("Local copy %{public}s (kB/s), fileSize = %{public}" PRId64 "(B), spendTime = %{public}" PRId64 "(ms)", + speed.c_str(), fileSize, spendTime); + return ret; } int32_t FileCopyManager::CopyFile(const std::string &src, const std::string &dest, std::shared_ptr infos) diff --git a/frameworks/native/distributed_file_inner/src/copy/file_size_utils.cpp b/frameworks/native/distributed_file_inner/src/copy/file_size_utils.cpp index 7265f206f46c3dd50d526417eaf28ce67748355c..5e02528f5232a4b542947e4af2a65188cd9b586b 100644 --- a/frameworks/native/distributed_file_inner/src/copy/file_size_utils.cpp +++ b/frameworks/native/distributed_file_inner/src/copy/file_size_utils.cpp @@ -17,6 +17,7 @@ #include #include +#include #include "dfs_error.h" #include "file_uri.h" @@ -40,6 +41,9 @@ static constexpr char PATH_INVALID_FLAG2[] = "/.."; static const uint32_t PATH_INVALID_FLAG_LEN = 3; static const char FILE_SEPARATOR_CHAR = '/'; static constexpr char NETWORK_ID[] = "?networkid="; +static constexpr uint32_t S_TO_MS = 1000; +static constexpr uint32_t KB_TO_B = 1024; +static constexpr uint32_t PRECISION = 2; int32_t FileSizeUtils::GetSize(const std::string &uri, bool isSrcUri, uint64_t &size) { @@ -253,6 +257,23 @@ bool FileSizeUtils::IsFilePathValid(const std::string &filePath) } return true; } + +std::string FileSizeUtils::CalculateSpeed(uint64_t fileSize, uint64_t spendTimeMs) +{ + if (spendTimeMs == 0) { + LOGW("Copy spend time is zero."); + return ""; + } + if (fileSize == 0) { + LOGW("Copy file size is zero."); + return ""; + } + double speed = (static_cast(fileSize) * S_TO_MS) / + (static_cast(spendTimeMs) * KB_TO_B); + std::ostringstream oss; + oss << std::fixed << std::setprecision(PRECISION) << speed; + return oss.str(); +} } // namespace DistributedFile } // namespace Storage } // namespace OHOS diff --git a/test/unittests/distributed_file_inner/copy/file_size_utils_test.cpp b/test/unittests/distributed_file_inner/copy/file_size_utils_test.cpp index 9ef5d706a76bc945c052cabfdb78f114c06ffd9b..5691f3ae890eb417cd57f9da6b5d3a7521d237e7 100644 --- a/test/unittests/distributed_file_inner/copy/file_size_utils_test.cpp +++ b/test/unittests/distributed_file_inner/copy/file_size_utils_test.cpp @@ -298,4 +298,20 @@ HWTEST_F(FileSizeUtilsTest, Deleter_0001, TestSize.Level1) FileSizeUtils::Deleter(arg); GTEST_LOG_(INFO) << "Deleter_0001 End"; } + +HWTEST_F(FileSizeUtilsTest, CalculateSpeed001, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "CalculateSpeed001 Start"; + try { + std::string speed = FileSizeUtils::CalculateSpeed(0, 1); + EXPECT_EQ(speed, ""); + speed = FileSizeUtils::CalculateSpeed(1, 0); + EXPECT_EQ(speed, ""); + speed = FileSizeUtils::CalculateSpeed(1024, 1000); + EXPECT_EQ(speed, "1.00"); + } catch (...) { + GTEST_LOG_(INFO) << "CalculateSpeed001 ERROR"; + } + GTEST_LOG_(INFO) << "CalculateSpeed001 End"; +} }