如何在主目录中创建文件夹?

时间:2011-02-03 19:57:28

标签: c++ boost directory boost-filesystem system-variable

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

我尝试使用boost::filesystem::create_directory(path),但它失败了 - 显然该函数不会扩展系统变量。

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

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

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

2 个答案:

答案 0 :(得分:15)

使用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复制的,除了它只处理当前用户。通过检查目标平台而不是盲目地尝试不同的环境变量,可以改进与平台无关的尝试,即使在Linux上不太可能设置USERPROFILEHOMEDRIVEHOMEPATH

答案 1 :(得分:4)

脱离我的头顶,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));
相关问题