¿Cómo crear una carpeta en el directorio de inicio?
-
28-10-2019 - |
Pregunta
Quiero crear un directorio path = "$HOME/somedir"
.
He intentado usar boost::filesystem::create_directory(path)
, pero falla: aparentemente la función no expande las variables del sistema.
¿Cómo puedo hacerlo de la manera más sencilla?
(Nota: en mi caso la cadena path
es constante y no sé con certeza si contiene una variable)
EDITAR: Estoy trabajando en Linux (aunque planeo portar mi aplicación a Windows en el futuro cercano).
Solución
Usar getenv para obtener variables de entorno, incluida HOME
. Si no sabe con certeza si podrían estar presentes, tendrá que analizar la cadena buscandolos.
También puede usar el shell del sistema y hacer eco para dejar que el shell haga esto por usted.
Getenv es portátil (del estándar C), pero usar el shell para hacer esto portátil será más difícil entre *nix y Windows. La convención para las variables de entorno también difiere entre *nix y Windows, pero presumiblemente la cadena es un parámetro de configuración que se puede modificar para la plataforma dada.
Si solo necesita apoyar la expansión de los directorios del hogar en lugar de las variables de entorno arbitrarias, puede usar el ~
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's OS.PATH.EXPANDUSER, excepto que solo maneja al usuario actual. El intento de ser la plataforma agnóstica podría mejorarse verificando la plataforma objetivo en lugar de probar ciegamente diferentes variables de entorno, aunque USERPROFILE
, HOMEDRIVE
, y HOMEPATH
Es poco probable que se establezca en Linux.
Otros consejos
La parte superior de mi cabeza,
namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));