Windows具有“已知路径”的概念,该函数具有无需硬编码路径即可检索它们的功能:
#include <filesystem>
#include <windows.h>
#include <ShlObj.h>
//...
std::filesystem::path GetAppDataPath() {
namespace FS = std::filesystem;
PWSTR ppszPath = nullptr;
auto hr_path = ::SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DEFAULT, nullptr, &ppszPath);
bool success = SUCCEEDED(hr_path);
if (success) {
auto p = FS::path(ppszPath);
::CoTaskMemFree(ppszPath);
p = FS::canonical(p);
return p;
}
return {};
}
Linux是否等效?
答案 0 :(得分:3)
Linux是操作系统内核。它没有用户目录的概念。
有几种Linux发行版。文件系统结构由发行版确定。大多数发行版都符合POSIX standard,并(在不同程度上)遵循Linux Foundation的Filesystem Hierarchy Standard,这与其他类似UNIX的系统的目录结构类似。也就是说,发行版通常允许用户以非常规配置使用文件系统。例如,他们通常不会强迫用户的主目录位于/home
下。
POSIX指定与此环境相关的一些环境变量:
HOME
系统应在登录时将该变量初始化为用户主目录的路径名。
TMPDIR
此变量应表示目录的路径名,该目录可用于需要放置临时文件的程序的程序。
可以在C ++中使用std::getenv
访问环境变量。
在台式机系统上,目录结构在某种程度上也取决于台式机环境,其中有几种可用。 freedesktop.org针对不同桌面环境的互操作性制定了非正式的规范。在DE符合XDG Base Directory Specification的情况下,以下环境变量应可用:
$ XDG_DATA_HOME定义应该相对于其存储用户特定数据文件的基本目录。如果$ XDG_DATA_HOME未设置或为空,则应使用等于$ HOME / .local / share的默认值。
$ XDG_CONFIG_HOME定义与用户特定配置文件相对应的基本目录。如果$ XDG_CONFIG_HOME未设置或为空,则应使用等于$ HOME / .config的默认值。
$ XDG_DATA_DIRS定义了除$ XDG_DATA_HOME基本目录之外,按优先级排序的基本目录集,以搜索数据文件。 $ XDG_DATA_DIRS中的目录应以冒号':'分隔。
如果$ XDG_DATA_DIRS未设置或为空,则应使用等于/ usr / local / share /:// usr / share /的值。
freedesktop.org还提供了实用程序xdg-user-dirs:
xdg-user-dirs是一个工具,可帮助管理“知名”用户目录,例如桌面文件夹和音乐文件夹。它还可以处理文件名的本地化(即翻译)。
$(XDG_CONFIG_HOME)/user-dirs.dirs指定用户的当前目录集。该文件为Shell格式,因此可以从Shell脚本轻松访问。用户也可以修改此文件(手动或通过应用程序)以更改使用的目录。
因此,在FOLDERID_RoamingAppData
的情况下,您可能应根据使用情况使用$XDG_x
中的一个,并相对于指定的$HOME
恢复到适当的默认值。