diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/folder/filelist.cpp | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/folder/filelist.cpp')
-rw-r--r-- | util/folder/filelist.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/util/folder/filelist.cpp b/util/folder/filelist.cpp new file mode 100644 index 0000000000..b21fcdbf20 --- /dev/null +++ b/util/folder/filelist.cpp @@ -0,0 +1,40 @@ +#include "dirut.h" +#include "filelist.h" +#include "iterator.h" + +#include <util/system/defaults.h> + +void TFileEntitiesList::Fill(const TString& dirname, TStringBuf prefix, TStringBuf suffix, int depth, bool sort) { + TDirIterator::TOptions opts; + opts.SetMaxLevel(depth); + if (sort) { + opts.SetSortByName(); + } + + TDirIterator dir(dirname, opts); + Clear(); + + size_t dirNameLength = dirname.length(); + while (dirNameLength && (dirname[dirNameLength - 1] == '\\' || dirname[dirNameLength - 1] == '/')) { + --dirNameLength; + } + + for (auto file = dir.begin(); file != dir.end(); ++file) { + if (file->fts_pathlen == file->fts_namelen || file->fts_pathlen <= dirNameLength) { + continue; + } + + TStringBuf filename = file->fts_path + dirNameLength + 1; + + if (filename.empty() || !filename.StartsWith(prefix) || !filename.EndsWith(suffix)) { + continue; + } + + if (((Mask & EM_FILES) && file->fts_info == FTS_F) || ((Mask & EM_DIRS) && file->fts_info == FTS_D) || ((Mask & EM_SLINKS) && file->fts_info == FTS_SL)) { + ++FileNamesSize; + FileNames.Append(filename.data(), filename.size() + 1); + } + } + + Restart(); +} |