-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathtinydir.cc
More file actions
50 lines (47 loc) · 1.54 KB
/
tinydir.cc
File metadata and controls
50 lines (47 loc) · 1.54 KB
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
// tiny directory listing
// - rlyeh, public domain | wtrmrkrlyeh
#pragma once
#include <string>
#ifdef _WIN32
#include <winsock2.h>
#else
#include <dirent.h>
#endif
template<typename FN>
bool tinydir( const char *directory, const FN &yield ) {
std::string src( directory );
while( !src.empty() && (src.back() == '/' || src.back() == '\\') ) src.pop_back();
#ifdef _WIN32
WIN32_FIND_DATA fdata;
for( HANDLE h = FindFirstFileA( (src + "/*").c_str(), &fdata ); h != INVALID_HANDLE_VALUE; ) {
for( bool next = true; next; next = FindNextFileA( h, &fdata ) != 0 ) {
if( fdata.cFileName[0] != '.' ) {
yield( (src + "/" + fdata.cFileName).c_str(), (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0 );
}
}
return FindClose( h ), true;
}
#else
for( DIR *dir = opendir( (src + "/").c_str() ); dir; ) {
for( struct dirent *ep; ep = readdir( dir ); ) {
if( ep->d_name[0] != '.' ) {
DIR *tmp = opendir( ep->d_name );
yield( (src + "/" + ep->d_name).c_str(), tmp ? (closedir( tmp ), 1) : 0 );
}
}
return closedir( dir ), true;
}
#endif
return false;
}
/*
#include <stdio.h>
#include <functional>
int main() {
std::function<void(const char *,bool)> callback = [&]( const char *name, bool is_dir ) {
printf( "%5s %s\n", is_dir ? "<dir>" : "", name );
//if( is_dir ) tinydir( name, callback ); // <-- uncomment for recursive listing
};
return tinydir( "./", callback );
}
*/