Как создать папку в домашнем каталоге? - PullRequest
7 голосов
/ 03 февраля 2011

Я хочу создать каталог path = "$HOME/somedir".

Я пытался использовать boost::filesystem::create_directory(path), но это не удалось - очевидно, функция не раскрывает системные переменные.

Как мне сделать это самым простым способом?

(примечание: в моем случае строка path является постоянной, и я не знаю точно, содержит ли она переменную)

edit: я работаю в Linux (хотя яв ближайшее время планирую перенести приложение на Windows).

Ответы [ 2 ]

15 голосов
/ 03 февраля 2011

Используйте 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.

4 голосов
/ 05 февраля 2011

с макушки головы,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...