diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d13544..5a4a604 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,15 +4,16 @@ project(ofen LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +if(NOT DEFINED USE_UTF8_ALL) if (MSVC) add_compile_options(/source-charset:utf-8) endif() - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_SYSTEM_NAME MATCHES "Windows") MESSAGE(STATUS "ofen Add MinGW Param.") add_compile_options(-finput-charset=utf-8) add_compile_options(-fexec-charset=gbk) endif() +endif() set(CMAKE_DEBUG_POSTFIX "d") message(STATUS "System: ${CMAKE_SYSTEM_NAME}") diff --git a/src/of_path.cpp b/src/of_path.cpp index 155bc2c..6a4c5b1 100644 --- a/src/of_path.cpp +++ b/src/of_path.cpp @@ -206,20 +206,35 @@ ofStrVec COfPath::match_files(const ofString& path) { ofStrVec ret; - fs::path in(path); - fs::path parent_path = in.parent_path(); - std::string filename_pattern = in.filename().string(); + // 使用宽字符版本的 fs::path + std::filesystem::path in(path); + std::filesystem::path parent_path = in.parent_path(); + ofString filename_pattern = in.filename().native(); // 使用 native() 获取正确的字符类型 if (parent_path.empty()) { - parent_path = fs::current_path(); + parent_path = std::filesystem::current_path(); } + // 根据 UNICODE_OFSTR 选择正确的正则表达式类型 +#ifdef UNICODE_OFSTR + std::wregex file_regex; + ofString regex_pattern = std::regex_replace(filename_pattern, std::wregex(ofT(R"(\*)")), ofT(".*")); + regex_pattern = std::regex_replace(regex_pattern, std::wregex(ofT(R"(\?)")), ofT(".")); +#else + std::regex file_regex; std::string regex_pattern = std::regex_replace(filename_pattern, std::regex(R"(\*)"), ".*"); regex_pattern = std::regex_replace(regex_pattern, std::regex(R"(\?)"), "."); +#endif try { - std::regex file_regex(regex_pattern); - for (const auto& entry : fs::directory_iterator(parent_path)) { +#ifdef UNICODE_OFSTR + file_regex = std::wregex(regex_pattern); +#else + file_regex = std::regex(regex_pattern); +#endif + + // 遍历目录 + for (const auto& entry : std::filesystem::directory_iterator(parent_path)) { #ifdef UNICODE_OFSTR if (std::regex_match(entry.path().filename().wstring(), file_regex)) { ret.push_back(entry.path().wstring());