From 04aa6ba9155d173f8bf63a93863fde340af51d02 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 30 Dec 2015 20:36:29 -1000 Subject: [PATCH] Add Win32 DirectoryEnumerator --- hecl/extern/libBoo | 2 +- hecl/include/HECL/HECL.hpp | 78 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/hecl/extern/libBoo b/hecl/extern/libBoo index 1c53398b7..53ad4df63 160000 --- a/hecl/extern/libBoo +++ b/hecl/extern/libBoo @@ -1 +1 @@ -Subproject commit 1c53398b75196381e0ce914e60622d235cc4e824 +Subproject commit 53ad4df63d85b8f35d5feaba360c3439e9cbc43c diff --git a/hecl/include/HECL/HECL.hpp b/hecl/include/HECL/HECL.hpp index 7607b8399..e19af2df5 100644 --- a/hecl/include/HECL/HECL.hpp +++ b/hecl/include/HECL/HECL.hpp @@ -568,6 +568,84 @@ public: if (HECL::Stat(path, &theStat) || !S_ISDIR(theStat.st_mode)) return; #if _WIN32 + HECL::SystemString wc(path); + wc += _S("/*"); + WIN32_FIND_DATAW d; + HANDLE dir = FindFirstFileW(wc.c_str(), &d); + if (dir == INVALID_HANDLE_VALUE) + return; + switch (mode) + { + case Mode::Native: + do + { + if (!wcscmp(d.cFileName, _S(".")) || !wcscmp(d.cFileName, _S(".."))) + continue; + HECL::SystemString fp(path); + fp += _S('/'); + fp += d.cFileName; + HECL::Sstat st; + if (HECL::Stat(fp.c_str(), &st)) + continue; + + size_t sz = 0; + bool isDir = false; + if (S_ISDIR(st.st_mode)) + isDir = true; + else if (S_ISREG(st.st_mode)) + sz = st.st_size; + else + continue; + + m_entries.push_back(std::move(Entry(std::move(fp), d.cFileName, sz, isDir))); + } while (FindNextFileW(dir, &d)); + break; + case Mode::DirsThenFilesSorted: + case Mode::DirsSorted: + { + std::map sort; + do + { + if (!wcscmp(d.cFileName, _S(".")) || !wcscmp(d.cFileName, _S(".."))) + continue; + HECL::SystemString fp(path); + fp +=_S('/'); + fp += d.cFileName; + HECL::Sstat st; + if (HECL::Stat(fp.c_str(), &st) || !S_ISDIR(st.st_mode)) + continue; + sort.emplace(std::make_pair(d.cFileName, Entry(std::move(fp), d.cFileName, 0, true))); + } while (FindNextFileW(dir, &d)); + for (auto& e : sort) + m_entries.push_back(std::move(e.second)); + if (mode == Mode::DirsSorted) + break; + FindClose(dir); + dir = FindFirstFileW(wc.c_str(), &d); + } + case Mode::FilesSorted: + { + if (mode == Mode::FilesSorted) + m_entries.clear(); + std::map sort; + do + { + if (!wcscmp(d.cFileName, _S(".")) || !wcscmp(d.cFileName, _S(".."))) + continue; + HECL::SystemString fp(path); + fp += _S('/'); + fp += d.cFileName; + HECL::Sstat st; + if (HECL::Stat(fp.c_str(), &st) || !S_ISREG(st.st_mode)) + continue; + sort.emplace(std::make_pair(d.cFileName, Entry(std::move(fp), d.cFileName, st.st_size, false))); + } while (FindNextFileW(dir, &d)); + for (auto& e : sort) + m_entries.push_back(std::move(e.second)); + break; + } + } + FindClose(dir); #else DIR* dir = opendir(path); if (!dir)