-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdirReader.cpp
73 lines (59 loc) · 1.56 KB
/
dirReader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
// dirReader.cpp
//
#include "dirReader.h"
//
// DirReader implementation
//
#include <dirent.h>
#include <string.h> // strerror
static int dirsort(const struct dirent** dir1, const struct dirent** dir2)
{
return -alphasort(dir1, dir2); // Alphabetic order
}
static int dirfilter(const struct dirent* dir)
{
// Ignore "." and ".."
if(dir->d_name[0] == '.' && dir->d_name[1] == '\0')
return 0; // Ignore
else if(dir->d_name[0] == '.' && dir->d_name[1] == '.' && dir->d_name[2] == '\0')
return 0; // Ignore
else
return 1; // Keep
}
bool DirReader::Read(const char* dirName, void* param)
{
if(mAbort)
return false;
struct dirent** dirlist{nullptr};
int n = scandir(dirName, &dirlist, dirfilter, dirsort);
if(n < 0)
{
mErrMsg = std::string("Could not scandir '") + dirName + "' because of: ";
mErrMsg += strerror(errno);
return false;
}
while(!mAbort && n--)
{
struct dirent* dir = dirlist[n];
if(dir->d_type == DT_DIR)
{
// Got sub-directory to read
void* subDirParam = OnDirectory(dirName, dir->d_name, param);
Read(std::string(dirName) + "/" + dir->d_name, subDirParam);
OnDirectoryEnd(dirName, subDirParam);
}
// else if(dir->d_type == DT_LNK)
// {
// // TODO: support for links
// }
else
{
// Got file
OnFile(dirName, dir->d_name, param);
}
free(dir);
}
free(dirlist);
return !mAbort;
}