diff options
Diffstat (limited to 'src/libutil/FileUtils.cpp')
-rw-r--r-- | src/libutil/FileUtils.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/libutil/FileUtils.cpp b/src/libutil/FileUtils.cpp new file mode 100644 index 0000000..64b1bb1 --- /dev/null +++ b/src/libutil/FileUtils.cpp @@ -0,0 +1,79 @@ +#include "util/FileUtils.hpp" + +#ifndef _WIN32 +#include <sys/types.h> +#include <dirent.h> +#include <limits.h> +#else +#define WIN32_MEAN_AND_LEAN +#include <windows.h> +#endif + +#include <sstream> +#include <stdexcept> +#include <cstring> +#include <cerrno> + +using namespace std; + +#ifndef _WIN32 +static vector<string> directory_entries_unix( const string &dir, bool absolute, bool recursive ) +{ + vector<string> files; + + DIR *d = opendir( dir.c_str( ) ); + if( d == NULL ) { + ostringstream ss; + ss << "opendir failed with '" << dir << "': " << strerror( errno ); + throw runtime_error( ss.str( ) ); + } + + struct dirent *entry = readdir( d ); + while( entry != NULL ) { + if( entry->d_type == DT_DIR ) { + if( strcmp( entry->d_name, "." ) == 0 || + strcmp( entry->d_name, ".." ) == 0 ) { + entry = readdir( d ); + continue; + } + if( recursive ) { + ostringstream ss; + ss << dir << "/" << entry->d_name; + vector<string> subfiles = directory_entries_unix( ss.str( ), absolute, recursive ); + files.insert( files.end( ), subfiles.begin( ), subfiles.end( ) ); + } + } else if( entry->d_type == DT_REG ) { + if( absolute ) { + ostringstream ss; + ss << dir << "/" << entry->d_name; + files.push_back( ss.str( ) ); + } else { + files.push_back( string( entry->d_name ) ); + } + } + entry = readdir( d ); + } + + closedir( d ); + + return files; +} +#endif + +#ifdef _WIN32 +static vector<string> directory_entries_win32( const string &/*dir*/, bool /*absolute*/, bool /* recursive */ ) +{ + vector<string> files; + + return files; +} +#endif + +UTIL_DLL_VISIBLE vector<string> directory_entries( const string &dir, bool absolute, bool recursive ) +{ +#ifdef _WIN32 + return directory_entries_win32( dir, absolute, recursive ); +#else + return directory_entries_unix( dir, absolute, recursive ); +#endif +} |