如何获取Linux已知路径

3

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有对应的替代品吗?


1
据我所知并没有。不过Linux文件系统通常遵循标准,但在某些发行版中可能会有变化。 - super
还有一些标准的环境变量通常会被设置,例如 USERHOME 等等。RoamingAppData 可能相当于 ${HOME}/.config 或类似的内容。 - Useless
1个回答

4

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

有几种Linux发行版。文件系统结构由发行版决定。大多数发行版遵循POSIX标准,并且在一定程度上遵循Linux Foundation的文件系统层次结构标准,这与其他类UNIX系统的目录结构相似。也就是说,发行版通常允许用户以非传统的配置使用文件系统。例如,它们通常不会强制用户的主目录位于/home下。

POSIX规定了几个与此上下文相关的环境变量:

HOME

The system shall initialize this variable at the time of login to be a pathname of the user's home directory.

TMPDIR

This variable shall represent a pathname of a directory made available for programs that need a place to create temporary files.

在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


顺便提一下,正确的命令是:xdg-user-dir(没有s)。 - Melroy van den Berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接