Fix directory iteration on Windows XP

This commit is contained in:
Thomas Goyne 2013-02-08 09:02:30 -08:00
parent d3606eac99
commit d34f88080c
1 changed files with 15 additions and 1 deletions

View File

@ -32,6 +32,20 @@ namespace bfs = boost::filesystem;
#undef CreateDirectory #undef CreateDirectory
namespace {
FINDEX_INFO_LEVELS find_info_level() {
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
if (osvi.dwMajorVersion > 6 || (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion >= 1))
return FindExInfoBasic;
else
return FindExInfoStandard;
}
}
namespace agi { namespace fs { namespace agi { namespace fs {
std::string ShortName(path const& p) { std::string ShortName(path const& p) {
std::wstring out(MAX_PATH + 1, 0); std::wstring out(MAX_PATH + 1, 0);
@ -68,7 +82,7 @@ DirectoryIterator::DirectoryIterator(path const& p, std::string const& filter)
: privdata(new PrivData) : privdata(new PrivData)
{ {
WIN32_FIND_DATA data; WIN32_FIND_DATA data;
privdata->h = FindFirstFileEx((p/(filter.empty() ? "*.*" : filter)).c_str(), FindExInfoBasic, &data, FindExSearchNameMatch, nullptr, 0); privdata->h = FindFirstFileEx((p/(filter.empty() ? "*.*" : filter)).c_str(), find_info_level(), &data, FindExSearchNameMatch, nullptr, 0);
if (privdata->h == INVALID_HANDLE_VALUE) { if (privdata->h == INVALID_HANDLE_VALUE) {
privdata.reset(); privdata.reset();
return; return;