Как создать папку в домашнем каталоге?

Я хочу создать каталог 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.


С моей макушки,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));