Как получить известные пути для Linux - PullRequest
3 голосов
/ 29 мая 2019

В 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 Ответ

4 голосов
/ 29 мая 2019

Linux - это ядро ​​операционной системы. У него нет концепции пользовательских каталогов.

Существует несколько дистрибутивов Linux. Структура файловой системы определяется дистрибутивом. Большинство дистрибутивов соответствуют стандарту POSIX и следуют (в различной степени) стандарту Иерархия файловых систем от Linux Foundation, который аналогичен структурам каталогов других UNIX-подобных систем. Тем не менее, дистрибутивы обычно позволяют пользователю использовать файловую систему в нестандартных конфигурациях. Например, они обычно не вынуждают домашний каталог пользователей находиться под /home.

POSIX указывает несколько переменных среды, которые имеют отношение к этому контексту:

HOME

Система должна инициализировать эту переменную во время входа в систему как путь к домашнему каталогу пользователя.

TMPDIR

Эта переменная должна представлять путь к каталогу, доступному для программ, которым требуется место для создания временных файлов.

Переменные окружения могут быть доступны с помощью std::getenv в C ++.


В настольных системах структура каталогов также в некоторой степени определяется средой рабочего стола, из которых доступно несколько. 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 указывает текущий набор каталогов для пользователя. Этот файл имеет формат оболочки, поэтому к нему легко получить доступ из сценария оболочки. Этот файл также может быть изменен пользователями (вручную или через приложения) для изменения используемых каталогов.


Так, в случае FOLDERID_RoamingAppData вам, вероятно, следует использовать один из $XDG_x в зависимости от варианта использования, возвращаясь к соответствующему значению по умолчанию относительно $HOME, как указано.

...