Skip to content

Commit dd774d0

Browse files
committed
Supports nested directories.
1 parent 0572beb commit dd774d0

File tree

2 files changed

+47
-28
lines changed

2 files changed

+47
-28
lines changed

inc/dest/util/glob.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ namespace dest {
2323
\param Directory to search in.
2424
\param extension Necessary file extension.
2525
\param stripExtension Whether or not to strip extension in results.
26+
\param recursive Traverse sub-directories too.
2627
\returns List of found files.
2728
*/
28-
std::vector<std::string> findFilesInDir(const std::string &directory, const std::string &extension, bool stripExtension);
29+
std::vector<std::string> findFilesInDir(const std::string &directory, const std::string &extension, bool stripExtension, bool recursive);
2930

3031
}
3132
}

src/util/glob.cpp

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,46 +10,64 @@
1010

1111
#include <dest/util/glob.h>
1212
#include <tinydir/tinydir.h>
13+
#include <stack>
1314

1415
namespace dest {
1516
namespace util {
1617

17-
std::vector<std::string> findFilesInDir(const std::string &directory, const std::string &extension, bool stripExtension)
18+
std::vector<std::string> findFilesInDir(const std::string &directory, const std::string &extension, bool stripExtension, bool recursive)
1819
{
1920
std::vector<std::string> files;
2021

22+
std::stack<std::string> dirsLeft;
23+
dirsLeft.push(directory);
24+
2125
tinydir_dir dir;
22-
if (tinydir_open(&dir, directory.c_str()) != 0)
23-
return files;
24-
25-
while (dir.has_next) {
26-
tinydir_file file;
27-
28-
if (tinydir_readfile(&dir, &file) != 0 || file.is_dir) {
29-
tinydir_next(&dir);
30-
continue;
31-
}
32-
33-
if (extension != file.extension) {
34-
tinydir_next(&dir);
26+
while (!dirsLeft.empty()) {
27+
std::string dirPath = dirsLeft.top(); dirsLeft.pop();
28+
29+
// Try to open directory
30+
if (tinydir_open(&dir, dirPath.c_str()) != 0)
3531
continue;
3632

33+
while (dir.has_next) {
34+
tinydir_file file;
35+
36+
if (tinydir_readfile(&dir, &file) != 0) {
37+
tinydir_next(&dir);
38+
continue;
39+
}
40+
41+
if (file.is_dir) {
42+
if (recursive && file.name != std::string(".") && file.name != std::string("..")) {
43+
dirsLeft.push(file.path);
44+
}
45+
tinydir_next(&dir);
46+
continue;
47+
}
48+
49+
if (extension != file.extension) {
50+
tinydir_next(&dir);
51+
continue;
52+
}
53+
54+
std::string path(file.path);
55+
56+
if (stripExtension) {
57+
size_t lastindex = path.find_last_of(".");
58+
std::string raw = path.substr(0, lastindex);
59+
files.push_back(raw);
60+
}
61+
else {
62+
files.push_back(path);
63+
}
64+
65+
tinydir_next(&dir);
3766
}
38-
39-
std::string path(file.path);
40-
41-
if (stripExtension) {
42-
size_t lastindex = path.find_last_of(".");
43-
std::string raw = path.substr(0, lastindex);
44-
files.push_back(raw);
45-
} else {
46-
files.push_back(path);
47-
}
48-
49-
tinydir_next(&dir);
67+
68+
tinydir_close(&dir);
5069
}
5170

52-
tinydir_close(&dir);
5371
return files;
5472

5573
}

0 commit comments

Comments
 (0)