static tb_void_t tb_directory_walk_impl(tb_wchar_t const* path, tb_bool_t recursion, tb_bool_t prefix, tb_directory_walk_func_t func, tb_cpointer_t priv) { // check tb_assert_and_check_return(path && func); // last tb_long_t last = tb_wcslen(path) - 1; tb_assert_and_check_return(last >= 0); // add \*.* tb_wchar_t temp_w[4096] = {0}; tb_char_t temp_a[4096] = {0}; tb_swprintf(temp_w, 4095, L"%s%s*.*", path, path[last] == L'\\'? L"" : L"\\"); // init info WIN32_FIND_DATAW find = {0}; HANDLE directory = INVALID_HANDLE_VALUE; if (INVALID_HANDLE_VALUE != (directory = FindFirstFileW(temp_w, &find))) { // walk do { // check if (tb_wcscmp(find.cFileName, L".") && tb_wcscmp(find.cFileName, L"..")) { // the temp path tb_long_t n = tb_swprintf(temp_w, 4095, L"%s%s%s", path, path[last] == L'\\'? L"" : L"\\", find.cFileName); if (n >= 0 && n < 4096) temp_w[n] = L'\0'; // wtoa temp n = tb_wtoa(temp_a, temp_w, 4095); if (n >= 0 && n < 4096) temp_a[n] = '\0'; // the file info tb_file_info_t info = {0}; if (tb_file_info(temp_a, &info)) { // do callback if (prefix) func(temp_a, &info, priv); // walk to the next directory if (info.type == TB_FILE_TYPE_DIRECTORY && recursion) tb_directory_walk_impl(temp_w, recursion, prefix, func, priv); // do callback if (!prefix) func(temp_a, &info, priv); } } } while (FindNextFileW(directory, &find)); // exit directory FindClose(directory); } }
/* ////////////////////////////////////////////////////////////////////////////////////// * compare */ static tb_void_t tb_test_wcscmp(tb_wchar_t const* s1, tb_wchar_t const* s2) { __tb_volatile__ tb_long_t n = 1000000; __tb_volatile__ tb_long_t r = 0; tb_hong_t t = tb_mclock(); while (n--) { r = tb_wcscmp(s1, s2); } t = tb_mclock() - t; tb_wprintf(L"%lld ms, tb_test_wcscmp(%s, %s) = %ld\n", t, s1, s2, r); }