lam*_*pak 7 c++ directory boost system-variable boost-filesystem
我想创建一个目录path = "$HOME/somedir".
我尝试过使用boost::filesystem::create_directory(path),但它失败了 - 显然该功能不会扩展系统变量.
我怎么能以最简单的方式做到这一点?
(注意:在我的情况下,字符串path是常量,我不确定它是否包含变量)
编辑:我正在Linux上工作(虽然我计划在不久的将来将我的应用程序移植到Windows).
Fre*_*urk 15
使用getenv获取环境变量,包括HOME.如果您不确定它们是否存在,则必须解析字符串以查找它们.
您也可以使用系统shell和echo让shell为您执行此操作.
Getenv是可移植的(来自标准C),但是使用shell来移植它会在*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;
}
Run Code Online (Sandbox Code Playgroud)
此行为是从Python的os.path.expanduser复制的,除了它只处理当前用户.在成为平台无关的尝试可能通过检查目标平台,而不是盲目地尝试不同的环境变量得到改善,尽管USERPROFILE,HOMEDRIVE和HOMEPATH不太可能在Linux上设置.