X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fwindows%2Fdir.cpp;fp=source%2Ffs%2Fwindows%2Fdir.cpp;h=c6f6b9b6bd29893535ca64dd5b4423b5a39a8ad0;hp=3d2bf6e65a8f5fd461a48d51d595265c1bad2fec;hb=41a8b75cd086d4d688a73778a4db0bd025965332;hpb=f804a61c1c58529e7c98555a921b56bc05059d5e diff --git a/source/fs/windows/dir.cpp b/source/fs/windows/dir.cpp index 3d2bf6e..c6f6b9b 100644 --- a/source/fs/windows/dir.cpp +++ b/source/fs/windows/dir.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "dir.h" using namespace std; @@ -20,6 +21,40 @@ void rmdir(const Path &path) throw system_error("RemoveDirectory"); } +vector list_filtered(const Path &path, const string &filter) +{ + Regex r_filter(filter); + + vector result; + WIN32_FIND_DATA entry; + string pattern = path.str()+"\\*"; + HANDLE search_handle = FindFirstFileEx(pattern.c_str(), FindExInfoBasic, &entry, FindExSearchNameMatch, 0, 0); + if(search_handle==INVALID_HANDLE_VALUE) + { + DWORD err = GetLastError(); + if(err==ERROR_FILE_NOT_FOUND) + return result; + throw system_error("FindFirstFileEx"); + } + + bool more = true; + for(; more; more=FindNextFile(search_handle, &entry)) + { + const char *fn = entry.cFileName; + if(fn[0]=='.' && (fn[1]==0 || (fn[1]=='.' && fn[2]==0))) + continue; + if(r_filter.match(fn)) + result.push_back(fn); + } + + DWORD err = GetLastError(); + FindClose(search_handle); + if(err!=ERROR_NO_MORE_FILES) + throw system_error("FindNextFile"); + + return result; +} + /* Windows documentation says Get/SetCurrentDirectory use a global buffer and are not thread safe. */ static Mutex &cwd_mutex()