我想创建一个目录path = "$HOME/somedir"
。
我尝试使用boost::filesystem::create_directory(path)
,但它失败了 - 显然该函数不会扩展系统变量。
我怎样才能以最简单的方式做到这一点?
(注意:在我的情况下,字符串path
是常量,我不确定它是否包含变量)
编辑:我正在使用Linux(尽管我计划在不久的将来将我的应用程序移植到Windows上)。
答案 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上不太可能设置USERPROFILE
,HOMEDRIVE
和HOMEPATH
。
答案 1 :(得分:4)
脱离我的头顶,
namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));