8

我想创建一个目录path = "$HOME/somedir"

我试过使用boost::filesystem::create_directory(path),但失败了——显然该函数没有扩展系统变量。

我怎样才能以最简单的方式做到这一点?

(注意:在我的情况下,字符串path是常量,我不确定它是否包含变量)

编辑:我正在使用 Linux(尽管我计划在不久的将来将我的应用程序移植到 Windows)。

4

2 回答 2

18

使用getenv获取环境变量,包括HOME. 如果您不确定它们是否存在,则必须解析字符串以查找它们。

您还可以使用系统 shell 和 echo 让 shell 为您执行此操作。

Getenv 是可移植的(来自标准 C),但是在 *nix 和 Windows 之间使用 shell 进行移植会更难。*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;
}

此行为是从 Python 的os.path.expanduser复制的,除了它只处理当前用户。可以通过检查目标平台而不是盲目地尝试不同的环境变量来改进与平台无关的尝试,即使USERPROFILE,HOMEDRIVEHOMEPATH不太可能在 Linux 上设置。

于 2011-02-03T20:09:15.497 回答
4

从我的头顶,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
于 2011-02-04T22:50:19.880 回答