Как создать папку в домашнем каталоге?
Я хочу создать каталог path = "$HOME/somedir"
.
Я пробовал использовать boost::filesystem::create_directory(path)
, но это не удается-по-видимому, функция не расширяет системные переменные.
как я могу сделать это более простым способом?
(примечание: в моем случае строка path
является постоянным, и я не знаю точно, содержит ли он переменную)
edit: я работаю над Linux (хотя я планирую перенести свое приложение в Windows в ближайшем будущем).
2 ответов
использовать getenv чтобы получить переменные среды, в том числе HOME
. Если вы не знаете наверняка, могут ли они присутствовать, вам придется проанализировать строку, ища их.
вы также можете использовать системную оболочку и эхо, чтобы оболочка сделала это за вас.
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.путь.expanduser, за исключением того, что он обрабатывает только текущего пользователя. Покушение на платформе может улучшайте, проверяя целевую платформу, а не слепо пробуя различные переменные среды, даже если USERPROFILE
, HOMEDRIVE
и HOMEPATH
вряд ли будут установлены на Linux.