From 2479427992a2746e7f09dbe6f89184e633129b3d Mon Sep 17 00:00:00 2001 From: Silent Date: Thu, 27 Jun 2019 10:37:49 +0200 Subject: [PATCH] Windows: Properly check for hidden files when enumerating files --- ext/native/file/file_util.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ext/native/file/file_util.cpp b/ext/native/file/file_util.cpp index 2d6c6df33c..a870518969 100644 --- a/ext/native/file/file_util.cpp +++ b/ext/native/file/file_util.cpp @@ -211,20 +211,19 @@ bool FileInfo::operator <(const FileInfo &other) const { size_t getFilesInDir(const char *directory, std::vector *files, const char *filter, int flags) { size_t foundEntries = 0; std::set filters; - std::string tmp; if (filter) { + std::string tmp; while (*filter) { if (*filter == ':') { - filters.insert(tmp); - tmp = ""; + filters.insert(std::move(tmp)); } else { tmp.push_back(*filter); } filter++; } + if (!tmp.empty()) + filters.insert(std::move(tmp)); } - if (tmp.size()) - filters.insert(tmp); #ifdef _WIN32 // Find the first file in the directory. WIN32_FIND_DATA ffd; @@ -252,14 +251,20 @@ size_t getFilesInDir(const char *directory, std::vector *files, const const std::string virtualName(result->d_name); #endif // check for "." and ".." - if (((virtualName[0] == '.') && (virtualName[1] == '\0')) || - ((virtualName[0] == '.') && (virtualName[1] == '.') && - (virtualName[2] == '\0'))) + if (virtualName == "." || virtualName == "..") continue; // Remove dotfiles (optional with flag.) - if (!(flags & GETFILES_GETHIDDEN) && virtualName[0] == '.') - continue; + if (!(flags & GETFILES_GETHIDDEN)) + { +#ifdef _WIN32 + if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0) + continue; +#else + if (virtualName[0] == '.') + continue; +#endif + } FileInfo info; info.name = virtualName; @@ -283,7 +288,7 @@ size_t getFilesInDir(const char *directory, std::vector *files, const } if (files) - files->push_back(info); + files->push_back(std::move(info)); foundEntries++; #ifdef _WIN32 } while (FindNextFile(hFind, &ffd) != 0);