diff --git a/Utilities/File.cpp b/Utilities/File.cpp index deaa13dbdc..f23bb336fe 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -1413,6 +1413,12 @@ fs::file::file(const std::string& path, bs_t mode) }; m_file = std::make_unique(fd); + + if (mode & fs::isfile && !(mode & fs::write) && stat().is_directory) + { + m_file.reset(); + g_tls_error = error::isdir; + } #endif } diff --git a/Utilities/File.h b/Utilities/File.h index 8e019d8cc5..3ba01c5c39 100644 --- a/Utilities/File.h +++ b/Utilities/File.h @@ -32,6 +32,7 @@ namespace fs excl, lock, unread, + isfile, __bitset_enum_max }; @@ -44,6 +45,7 @@ namespace fs constexpr auto excl = +open_mode::excl; // Failure if the file already exists (used with `create`) constexpr auto lock = +open_mode::lock; // Prevent opening the file more than once constexpr auto unread = +open_mode::unread; // Aggressively prevent reading the opened file (do not use) + constexpr auto isfile = +open_mode::isfile; // Ensure valid fs::file handle is not of directory constexpr auto write_new = write + create + excl; constexpr auto rewrite = write + create + trunc; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp index b01b9dde9b..c4507243a9 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_controls.cpp @@ -27,9 +27,9 @@ namespace rsx { image_info::image_info(const char* filename) { - fs::file f(filename); + fs::file f(filename, fs::read + fs::isfile); - if (!f || f.stat().is_directory) + if (!f) { rsx_log.error("Image resource file `%s' could not be opened (%s)", filename, fs::g_tls_error); return; diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index e67abdb023..90cd936055 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -931,7 +931,7 @@ game_boot_result Emulator::Load(const std::string& title_id, bool add_only, bool break; } - if (fs::file sfb_file{parent_dir + "/PS3_DISC.SFB"}; sfb_file && sfb_file.size() >= 4 && sfb_file.read() == ".SFB"_u32) + if (fs::file sfb_file{parent_dir + "/PS3_DISC.SFB", fs::read + fs::isfile}; sfb_file && sfb_file.size() >= 4 && sfb_file.read() == ".SFB"_u32) { main_dir_name = std::string_view{search_dir}.substr(search_dir.find_last_of(fs::delim) + 1);