Mercurial > minori
diff src/core/filesystem.cc @ 135:0a458cb26ff4
filesystem: move to using std::filesystem after C++17 switch
old compilers will croak compiling this, but it's not like we
*really* need to support them (they probably croak compiling
Qt as well)
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Thu, 09 Nov 2023 18:01:56 -0500 |
parents | 54c9d36207db |
children | 7d3ad9529c4c |
line wrap: on
line diff
--- a/src/core/filesystem.cc Thu Nov 09 13:53:04 2023 -0500 +++ b/src/core/filesystem.cc Thu Nov 09 18:01:56 2023 -0500 @@ -19,139 +19,59 @@ #include "core/filesystem.h" #include "core/config.h" #include "core/strings.h" +#include <filesystem> #include <limits.h> -/* TODO: remove this and use std::filesystem */ - namespace Filesystem { -Path::Path() { - _path = ""; -} -Path::Path(const std::string& path) { - _path = path; -} -Path::Path(const Path& path) { - _path = path.GetPath(); -} - -bool Path::CreateDirectories() const { - std::string temp = ""; - size_t start; - size_t end = 0; - temp.append(_path.substr(0, _path.find_first_not_of(DELIM, end))); - - while ((start = _path.find_first_not_of(DELIM, end)) != std::string::npos) { - end = _path.find(DELIM, start); - temp.append(_path.substr(start, end - start)); -#ifdef WIN32 - if (!CreateDirectoryW(Strings::ToWstring(temp).c_str(), NULL) && GetLastError() == ERROR_PATH_NOT_FOUND) - /* ERROR_PATH_NOT_FOUND should NOT happen here */ - return false; -#else - struct stat st; - if (stat(temp.c_str(), &st) == -1) - mkdir(temp.c_str(), 0755); -#endif - temp.append(DELIM); - } - return true; -} - -bool Path::Exists() const { -#ifdef WIN32 - std::wstring buf = Strings::ToWstring(_path); - return GetFileAttributesW(buf.c_str()) != INVALID_FILE_ATTRIBUTES; -#else - struct stat st; - return stat(_path.c_str(), &st) == 0; -#endif -} - -std::string Path::Basename() const { - unsigned long long pos = _path.find_last_of(DELIM); - return pos != std::string::npos ? _path.substr(pos + 1, _path.length()) : ""; -} - -std::string Path::Stem() const { - std::string basename = Basename(); - unsigned long long pos = basename.find_last_of("."); - return pos != std::string::npos ? basename.substr(0, pos) : ""; -} - -std::string Path::Extension() const { - std::string basename = Basename(); - unsigned long long pos = basename.find_last_of("."); - return pos != std::string::npos ? basename.substr(pos + 1, basename.length()) : ""; -} - -Path Path::GetParent() const { - return _path.substr(0, _path.find_last_of(DELIM)); +/* this runs fs::create_directories() on the + PARENT directory. */ +void CreateDirectories(const std::filesystem::path& path) { + std::filesystem::create_directories(path.parent_path()); } -void Path::SetPath(const std::string& path) { - _path = path; -} - -std::string Path::GetPath() const { - return _path; -} - -Path GetDotPath(void) { - std::string ret = ""; +std::filesystem::path GetDotPath() { #ifdef WIN32 - std::wstring buf(MAX_PATH, '\0'); - if (SHGetFolderPathAndSubDirW(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, CONFIG_WDIR, &buf.front()) == - S_OK) { - buf.resize(buf.find('\0')); - ret += Strings::ToUtf8String(buf); - } + std::filesystem::path path; + wchar_t* buf; + if (SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_CREATE, NULL, &buf) == S_OK) + path = buf; + else + return std::filesystem::path(); + CoTaskMemFree(buf); + return path / CONFIG_DIR; #elif defined(MACOSX) - ret += osx::GetApplicationSupportDirectory(); - ret += DELIM CONFIG_DIR; + return std::filesystem::path(osx::GetApplicationSupportDirectory()) / CONFIG_DIR; #else // just assume POSIX - if (getenv("HOME") != NULL) - ret += getenv("HOME"); + const char* home = getenv("HOME"); + if (home != NULL) + path = home; # ifdef __linux__ else - ret += getpwuid(getuid())->pw_dir; + path = getpwuid(getuid())->pw_dir; # endif // __linux__ - if (!ret.empty()) - ret += DELIM ".config" DELIM CONFIG_DIR; + if (!path.empty()) + return path / ".config"; + else + return std::filesystem::path(); #endif // !WIN32 && !MACOSX - return ret; -} - -Path GetConfigPath(void) { - std::string ret = ""; - ret += GetDotPath().GetPath(); - if (!ret.empty()) - ret += DELIM CONFIG_NAME; - return ret; + return path / CONFIG_DIR; } -Path GetPlayersPath(void) { - std::string ret = ""; - ret += GetDotPath().GetPath(); - if (!ret.empty()) - ret += DELIM "players.json"; - return ret; +std::filesystem::path GetConfigPath() { + return GetDotPath() / CONFIG_NAME; } -Path GetExtensionsPath(void) { - std::string ret = ""; - ret += GetDotPath().GetPath(); - if (!ret.empty()) - ret += DELIM "extensions.json"; - return ret; +std::filesystem::path GetPlayersPath() { + return GetDotPath() / "recognition" / "players.json"; } -Path GetAnimeDBPath(void) { - std::string ret = ""; - ret += GetDotPath().GetPath(); - if (!ret.empty()) - ret += DELIM "anime" DELIM "db.json"; - return ret; +std::filesystem::path GetExtensionsPath() { + return GetDotPath() / "recognition" / "extensions.json"; +} + +std::filesystem::path GetAnimeDBPath() { + return GetDotPath() / "anime" / "db.json"; } } // namespace Filesystem