如何获取Linux的已知路径

时间:2019-05-29 15:38:08

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

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 个答案:

答案 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恢复到适当的默认值。