diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 407ed047a..8a8ff3092 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -26,6 +26,9 @@ #define stat _stat64 #define fstat _fstat64 #define fileno _fileno +// Windows version, at least Vista is required to obtain AppData Path +#define WINVER 0x0600 +#define _WIN32_WINNT 0x0600 #else #ifdef __APPLE__ #include @@ -594,6 +597,21 @@ std::string& GetExeDirectory() { } return exe_path; } + +std::string& AppDataLocalDirectory() { + // Windows Vista or later only + static std::string local_path; + if (local_path.empty()) { + PWSTR pw_local_path = 0; + wchar_t* wchar_local_path; + SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pw_local_path); + wchar_local_path = pw_local_path; + local_path = Common::UTF16ToUTF8(wchar_local_path); + // Freeing memory + CoTaskMemFree(static_cast(pw_local_path)); + } + return local_path; +} #else /** * @return The user’s home directory on POSIX systems @@ -671,6 +689,11 @@ const std::string& GetUserPath(const unsigned int DirIDX, const std::string& new if (paths[D_USER_IDX].empty()) { #ifdef _WIN32 paths[D_USER_IDX] = GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; + if (!FileUtil::IsDirectory(paths[D_USER_IDX])) { + paths[D_USER_IDX] = + AppDataLocalDirectory() + DIR_SEP + EMU_DATA_DIR DIR_SEP USERDATA_DIR DIR_SEP; + } + paths[D_CONFIG_IDX] = paths[D_USER_IDX] + CONFIG_DIR DIR_SEP; paths[D_CACHE_IDX] = paths[D_USER_IDX] + CACHE_DIR DIR_SEP; #else diff --git a/src/common/file_util.h b/src/common/file_util.h index 204b06f14..03cb222fe 100644 --- a/src/common/file_util.h +++ b/src/common/file_util.h @@ -154,6 +154,7 @@ std::string GetBundleDirectory(); #ifdef _WIN32 std::string& GetExeDirectory(); +std::string& AppDataLocalDirectory(); #endif size_t WriteStringToFile(bool text_file, const std::string& str, const char* filename);