Utilice getenv para obtener variables de entorno, incluyendo HOME
. Si no está seguro de si podrían estar presentes, tendrá que analizar la cadena buscándolos.
También podría usar el shell y el eco del sistema para dejar que el shell lo haga por usted.
Getenv es portátil (a partir del estándar C), pero usar el shell para hacer esto de forma portátil será más difícil entre * nix y Windows. La convención para variables de entorno difiere entre * nix y Windows también, pero presumiblemente la cadena es un parámetro de configuración que puede modificarse para la plataforma dada.
Si sólo necesita para apoyar la expansión de los directorios de inicio en lugar de variables de entorno arbitrarias, puede utilizar la convención ~
y luego ~/somedir
para sus cadenas de configuración:
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;
}
Este comportamiento se copia de Python de os.path.expanduser, excepto que solo maneja el usuario actual. El intento de ser independiente de la plataforma podría mejorarse verificando la plataforma de destino en lugar de intentar ciegamente diferentes variables de entorno, aunque USERPROFILE
, HOMEDRIVE
y HOMEPATH
es poco probable que se configuren en Linux.
Estás trabajando en Linux o Windows? – Nawaz