diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index aa1ebee0d791db60bebe4ff751123d2d3e011507..3208db4eaae50c8976c4dc3afdd8238922ed1820 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -49,7 +49,7 @@ TarFile &TarFile::GetInstance() bool TarFile::Packet(const vector &srcFiles, const string &tarFileName, const string &pkPath, TarMap &tarMap) { - if (srcFiles.empty() || tarFileName.empty() || pkPath.empty()) { + if (tarFileName.empty() || pkPath.empty()) { HILOGE("Invalid parameter"); return false; } diff --git a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp index 9b714ce2a4c35075dc7d0904f6fe19c3ae235d04..326d46f6da6a372e668f9d8d0f0a7482a9fb68af 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -269,20 +269,29 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0300, testing::ext::TestSize.Level1) string cmdMkdir = string("mkdir -p ") + preparedDir + string("test/test1/test2"); system(cmdMkdir.c_str()); string touchFilePrefix = string("touch ") + preparedDir; - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); + string fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt";; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt";; + system(fileName.c_str()); touchFilePrefix = string("touch ") + preparedDir + string("test/"); - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); - touchFilePrefix = string("touch ") + preparedDir + string("test/test1/test2"); - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); - vector includes = {preparedDir + string("/*"), preparedDir + string("test")}; - vector excludes = {preparedDir + string("/test/test1/test2"), {}}; + fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt"; + system(fileName.c_str()); + touchFilePrefix = string("touch ") + preparedDir + string("test/test1/test2/"); + fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt"; + system(fileName.c_str()); + vector includes = {preparedDir + string("*"), preparedDir + string("test/")}; + vector excludes = {preparedDir + string("test/test1/test2/"), {}}; auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); EXPECT_EQ(errCode, ERR_OK); } catch (...) { diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 1154b0727e4bea6d604da428431c2454f432e4e3..4b4f64a604f39929cf4dfb7f6c64092bd3d62ec8 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -53,24 +53,53 @@ static bool IsEmptyDirectory(const string &path) return isEmpty; } +static tuple, vector> GetFile(const string &path, off_t size = -1) +{ + map files; + vector smallFiles; + // 如果是文件,也添加进来,需要过滤 / 根路径 + HILOGE("not directory path: %{private}s", path.c_str()); + struct stat sta = {}; + if (stat(path.data(), &sta) == -1) { + return {BError(errno).GetCode(), files, smallFiles}; + } + if (path == "/") { + return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; + } + if (sta.st_size <= size) { + HILOGE("Find small file %{public}s", path.c_str()); + smallFiles.emplace_back(path); + } else { + HILOGE("Find big file %{public}s", path.c_str()); + files.try_emplace(path, sta); + } + return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; +} + static tuple, vector> GetDirFilesDetail(const string &path, bool recursion, off_t size = -1) { map files; vector smallFiles; - + HILOGE("GetDirFilesDetail path %{public}s", path.c_str()); if (IsEmptyDirectory(path)) { - smallFiles.emplace_back(path); + HILOGE("GetDirFilesDetail2 path %{public}s", path.c_str()); + string newPath = path; + if (path.at(path.size()-1) != '/') { + newPath += '/'; + } + HILOGE("GetDirFilesDetail3 path %{public}s", newPath.c_str()); + smallFiles.emplace_back(newPath); return {ERR_OK, files, smallFiles}; } unique_ptr> dir = {opendir(path.c_str()), closedir}; if (!dir) { - HILOGE("Invalid directory path: %{private}s", path.c_str()); - return {BError(errno).GetCode(), files, smallFiles}; + HILOGE("GetDirFilesDetail4 path %{public}s", path.c_str()); + return GetFile(path, size); } - + HILOGE("GetDirFilesDetail5 path %{public}s", path.c_str()); struct dirent *ptr = nullptr; while (!!(ptr = readdir(dir.get()))) { // current dir OR parent dir @@ -104,7 +133,7 @@ static tuple, vector> GetDirFilesDetai files.try_emplace(fileName, sta); } } - + HILOGE("GetDirFilesDetail6 path %{public}s", path.c_str()); return {ERR_OK, files, smallFiles}; } @@ -132,7 +161,7 @@ tuple> BDir::GetDirFiles(const string &path) return {ERR_OK, files}; } -static set ExpandPathWildcard(const vector &vec) +static set ExpandPathWildcard(const vector &vec, bool onlyPath) { unique_ptr> gl {new glob_t, [](glob_t *ptr) { globfree(ptr); }}; *gl = {}; @@ -152,7 +181,7 @@ static set ExpandPathWildcard(const vector &vec) for (auto it = expandPath.begin(); it != expandPath.end(); ++it) { filteredPath.insert(*it); - if (*it->rbegin() != '/') { + if (onlyPath && *it->rbegin() != '/') { continue; } auto jt = it; @@ -168,7 +197,7 @@ static set ExpandPathWildcard(const vector &vec) tuple, vector> BDir::GetBigFiles(const vector &includes, const vector &excludes) { - set inc = ExpandPathWildcard(includes); + set inc = ExpandPathWildcard(includes, false); map incFiles; vector incSmallFiles; @@ -189,7 +218,11 @@ tuple, vector> BDir::GetBigFiles(const return false; } for (const string &item : s) { - if (!item.empty() && (fnmatch(item.data(), str.data(), FNM_LEADING_DIR) == 0)) { + string excludeItem = item; + if (excludeItem.at(item.size() - 1) == '/') { + excludeItem += "*"; + } + if (!item.empty() && fnmatch(excludeItem.data(), str.data(), FNM_LEADING_DIR) == 0) { HILOGI("file %{public}s matchs exclude condition", str.c_str()); return true; } @@ -197,6 +230,14 @@ tuple, vector> BDir::GetBigFiles(const return false; }; + vector resSmallFiles; + for (const auto &item : incSmallFiles) { + if (!isMatch(excludes, item)) { + HILOGI("smallfile %{public}s matchs include condition and unmatchs exclude condition", item.c_str()); + resSmallFiles.emplace_back(item); + } + } + map bigFiles; for (const auto &item : incFiles) { if (!isMatch(excludes, item.first)) { @@ -205,14 +246,14 @@ tuple, vector> BDir::GetBigFiles(const } } HILOGI("total number of big files is %{public}d", static_cast(bigFiles.size())); - HILOGI("total number of small files is %{public}d", static_cast(incSmallFiles.size())); - return {ERR_OK, move(bigFiles), move(incSmallFiles)}; + HILOGI("total number of small files is %{public}d", static_cast(resSmallFiles.size())); + return {ERR_OK, move(bigFiles), move(resSmallFiles)}; } vector BDir::GetDirs(const vector &paths) { vector wildcardPath(paths.begin(), paths.end()); - set inc = ExpandPathWildcard(wildcardPath); + set inc = ExpandPathWildcard(wildcardPath, true); vector dirs(inc.begin(), inc.end()); return dirs; } diff --git a/utils/src/b_json/b_json_entity_extension_config.cpp b/utils/src/b_json/b_json_entity_extension_config.cpp index 4c9a845e8b2007e35e9d1413315eb6920ff284d3..8e87fa30299db725df24d5c15bfd92101b05410a 100644 --- a/utils/src/b_json/b_json_entity_extension_config.cpp +++ b/utils/src/b_json/b_json_entity_extension_config.cpp @@ -47,7 +47,7 @@ vector BJsonEntityExtensionConfig::GetIncludes() const vector dirs; for (auto &&item : obj_["includes"]) { - if (!item.isString()) { + if (!item.isString() || item.empty()) { HILOGE("Each item of array 'includes' must be of the type string"); continue; }