aboutsummaryrefslogtreecommitdiffstats
path: root/util/folder/filelist.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/folder/filelist.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/folder/filelist.cpp')
-rw-r--r--util/folder/filelist.cpp40
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();
+}