我想创建一个目录
path = "$HOME/somedir"
。
我尝试过使用
boost::filesystem::create_directory(path)
,但它失败了 - 显然该函数不会扩展系统变量。
我怎样才能以最简单的方式做到这一点?
(注意:在我的例子中,字符串
path
是常量,我不确定它是否包含变量)
编辑:我正在 Linux 上工作(尽管我计划在不久的将来将我的应用程序移植到 Windows)。
使用 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 上设置 USERPROFILE、HOMEDRIVE 和 HOMEPATH,但可以通过检查目标平台而不是盲目地尝试不同的环境变量来改进与平台无关的尝试。
我的头顶上,
namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));