3

Windows 有一个 Known Path 的概念,其中包含无需硬编码路径即可检索它们的函数:

#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有没有等价物?

4

1 回答 1

4

Linux 是一个操作系统内核。它没有用户目录的概念。

有几个 Linux 发行版。文件系统结构由发行版确定。大多数发行版都符合POSIX 标准,并且(在不同程度上)遵循 Linux 基金会的文件系统层次标准,这类似于其他类 UNIX 系统的目录结构。也就是说,发行版通常允许用户在非常规配置中使用文件系统。例如,他们通常不会强制用户主目录位于/home.

POSIX 指定了一些与此上下文相关的环境变量:

HOME

系统应在登录时将此变量初始化为用户主目录的路径名。

TMPDIR

这个变量应该代表一个目录的路径名,该路径名可用于需要一个地方来创建临时文件的程序。

可以使用std::getenvC++ 访问环境变量。


在桌面系统上,目录结构在某种程度上也由桌面环境决定,其中有几个可用的。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指定的适当默认值。

于 2019-05-29T16:07:33.467 回答