diff --git a/include/spdlog/common.h b/include/spdlog/common.h index 923e9068..768f2a36 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -6,6 +6,10 @@ #include #include +#ifdef _WIN32 +#include +#endif + #include #include #include @@ -88,9 +92,15 @@ class sink; #if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) using filename_t = std::wstring; +using win32_find_data = WIN32_FIND_DATAW; +#define find_first_file FindFirstFileW +#define find_next_file FindNextFileW #define SPDLOG_FILENAME_T(s) L##s #else using filename_t = std::string; +using win32_find_data = WIN32_FIND_DATAA; +#define find_first_file FindFirstFileA +#define find_next_file FindNextFileA #define SPDLOG_FILENAME_T(s) s #endif diff --git a/include/spdlog/details/os-inl.h b/include/spdlog/details/os-inl.h index 230c6ebf..e0b1de4e 100644 --- a/include/spdlog/details/os-inl.h +++ b/include/spdlog/details/os-inl.h @@ -554,51 +554,20 @@ std::string SPDLOG_INLINE getenv(const char *field) } #ifdef _WIN32 -#ifdef SPDLOG_WCHAR_FILENAMES -SPDLOG_INLINE std::vector get_directory_files(const std::wstring &directory) SPDLOG_NOEXCEPT -{ - std::vector files; - - HANDLE dir; - WIN32_FIND_DATAW file_data; - - if ((dir = FindFirstFileW((directory + L"/*").c_str(), &file_data)) == INVALID_HANDLE_VALUE) - return files; - - do - { - const std::wstring file_name = file_data.cFileName; - const std::wstring full_file_name = directory + L"/" + file_name; - const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; - - if (file_name[0] == '.') - continue; - - if (is_directory) - continue; - - files.push_back(full_file_name); - } while (FindNextFileW(dir, &file_data)); - - FindClose(dir); - - return files; -} -#else -SPDLOG_INLINE std::vector get_directory_files(const std::string &directory) SPDLOG_NOEXCEPT +SPDLOG_INLINE std::vector get_directory_files(const filename_t &directory) SPDLOG_NOEXCEPT { - std::vector files; + std::vector files; HANDLE dir; - WIN32_FIND_DATAA file_data; + win32_find_data file_data; - if ((dir = FindFirstFileA((directory + "/*").c_str(), &file_data)) == INVALID_HANDLE_VALUE) + if ((dir = find_first_file((directory + SPDLOG_FILENAME_T("/*")).c_str(), &file_data)) == INVALID_HANDLE_VALUE) return files; do { - const std::string file_name = file_data.cFileName; - const std::string full_file_name = directory + "/" + file_name; + const filename_t file_name = file_data.cFileName; + const filename_t full_file_name = directory + SPDLOG_FILENAME_T("/") + file_name; const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; if (file_name[0] == '.') @@ -608,13 +577,12 @@ SPDLOG_INLINE std::vector get_directory_files(const std::string &di continue; files.push_back(full_file_name); - } while (FindNextFileA(dir, &file_data)); + } while (find_next_file(dir, &file_data)); FindClose(dir); return files; } -#endif #else SPDLOG_INLINE std::vector get_directory_files(const std::string &directory) SPDLOG_NOEXCEPT { diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index 937e5b67..c7d23f69 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -102,11 +102,7 @@ SPDLOG_API bool create_dir(filename_t path); // return empty string if field not found SPDLOG_API std::string getenv(const char *field); -#if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES) -SPDLOG_API std::vector get_directory_files(const std::wstring &directory) SPDLOG_NOEXCEPT; -#else -SPDLOG_API std::vector get_directory_files(const std::string &directory) SPDLOG_NOEXCEPT; -#endif +SPDLOG_API std::vector get_directory_files(const filename_t &directory) SPDLOG_NOEXCEPT; } // namespace os } // namespace details