@@ -959,7 +959,7 @@ inline void check_win32_9xa_dir_is_valid(win32_9xa_dir_handle const &h)
959959 ::fast_io::win32::win32_find_dataa wfda{};
960960 tlc_win32_9xa_dir_handle_path_str temp_find_path{concat_tlc_win32_9xa_dir_handle_path_str (h.path , u8" \\ *" )};
961961 auto find_struct{::fast_io::win32::FindFirstFileA (reinterpret_cast <char const *>(temp_find_path.c_str ()), __builtin_addressof (wfda))};
962- if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 )))
962+ if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 ))) [[unlikely]]
963963 {
964964 throw_win32_error (0x5 );
965965 }
@@ -969,14 +969,39 @@ inline void check_win32_9xa_dir_is_valid(win32_9xa_dir_handle const &h)
969969 }
970970}
971971
972+ inline bool get_win32_9xa_dir_validity (win32_9xa_dir_handle const &h)
973+ {
974+ ::fast_io::win32::win32_find_dataa wfda{};
975+ tlc_win32_9xa_dir_handle_path_str temp_find_path{concat_tlc_win32_9xa_dir_handle_path_str (h.path , u8" \\ *" )};
976+ auto find_struct{::fast_io::win32::FindFirstFileA (reinterpret_cast <char const *>(temp_find_path.c_str ()), __builtin_addressof (wfda))};
977+ if (find_struct == reinterpret_cast <void *>(static_cast <::std::ptrdiff_t >(-1 ))) [[unlikely]]
978+ {
979+ return false ;
980+ }
981+ else
982+ {
983+ ::fast_io::win32::FindClose (find_struct);
984+ return true ;
985+ }
986+ }
987+
972988template <bool throw_eh = false >
973989inline void close_win32_9xa_dir_handle (win32_9xa_dir_handle &h) noexcept (!throw_eh)
974990{
975991 if constexpr (throw_eh)
976992 {
977- check_win32_9xa_dir_is_valid (h);
993+ // Make sure to successfully close even if an exception is thrown.
994+ bool const is_win32_9xa_dir_validid{get_win32_9xa_dir_validity (h)};
995+ h.path .clear ();
996+ if (!is_win32_9xa_dir_validid) [[unlikely]]
997+ {
998+ throw_win32_error (0x5 );
999+ }
1000+ }
1001+ else
1002+ {
1003+ h.path .clear ();
9781004 }
979- h.path .clear ();
9801005}
9811006
9821007inline win32_9xa_dir_handle win32_9xa_dir_dup_impl (win32_9xa_dir_handle const &h)
0 commit comments