Используйте getenv для получения переменных среды, включая HOME
.Если вы точно не знаете, могут ли они присутствовать, вам придется проанализировать строку, чтобы найти их.
Вы также можете использовать системную оболочку и команду echo, чтобы она сделала это за вас.
Getenv является переносимым (из стандарта C), но использование оболочки для этого будет сложнее между * nix и Windows.Соглашение о переменных среды также различается между * nix и Windows, но, предположительно, строка является параметром конфигурации, который можно изменить для данной платформы.
Если вам нужно только поддерживать расширение домашних каталогов, а не произвольные переменные среды,вы можете использовать соглашение ~
, а затем ~/somedir
для строк конфигурации:
std::string expand_user(std::string path) {
if (not path.empty() and path[0] == '~') {
assert(path.size() == 1 or path[1] == '/'); // or other error handling
char const* home = getenv("HOME");
if (home or ((home = getenv("USERPROFILE")))) {
path.replace(0, 1, home);
}
else {
char const *hdrive = getenv("HOMEDRIVE"),
*hpath = getenv("HOMEPATH");
assert(hdrive); // or other error handling
assert(hpath);
path.replace(0, 1, std::string(hdrive) + hpath);
}
}
return path;
}
Это поведение скопировано из os.path.expanduser Python *, за исключением того, что оно обрабатывает толькотекущий пользователь.Попытка быть независимой от платформы может быть улучшена путем проверки целевой платформы, а не слепой проверки различных переменных окружения, даже если USERPROFILE
, HOMEDRIVE
и HOMEPATH
вряд ли будут установлены в Linux.