【问题标题】:How to get known paths for linux如何获取 linux 的已知路径
【发布时间】:2019-10-15 06:40:49
【问题描述】:

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

【问题讨论】:

标签: c++ linux path c++17 known-folders


【解决方案1】:

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

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

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

HOME

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

TMPDIR

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

可以在 C++ 中使用std::getenv 访问环境变量。


在桌面系统上,目录结构在某种程度上也由桌面环境决定,其中有几种可用。 freedesktop.org 为不同桌面环境的互操作性制定了非官方规范。在符合 XDG Base Directory Specification 的 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 的适当默认值。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2021-11-25
    • 2010-09-08
    • 2019-08-03
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多