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有等价物吗?
Linux 是一个操作系统内核。它没有用户目录的概念。
有几个Linux发行版。文件系统结构由发行版决定。大多数发行版都符合POSIX标准,并(在不同程度上)遵循Linux基金会的文件系统层次结构标准,该标准类似于其他类似UNIX系统的目录结构。也就是说,发行版通常允许用户在非常规配置中使用文件系统。例如,它们通常不会强制用户主目录处于/home
下。
POSIX 指定了一些与此上下文相关的环境变量:
HOME
系统应在登录时将此变量初始化为用户主目录的路径名。
TMPDIR
此变量应表示目录的路径名,该目录可用于需要位置创建临时文件的程序。
可以使用C++中的std::getenv
访问环境变量。
在桌面系统上,目录结构也在一定程度上由桌面环境决定,其中有几个可用的。 freedesktop.org 为不同桌面环境的互操作性生成非官方规范。在符合 XDG 基本目录规范的 DE 上,应提供以下环境变量:
$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
的适当默认值。