Estoy escribiendo un pequeño código c ++ para acceder y editar cierto archivo de texto en el directorio de inicio del usuario. Actualmente tengo el siguiente código (esta es la parte relevante):
bool core(void) { std::string autostart_entry = ""; std::string user_entry = ""; std::fstream username; username.open("username.txt", std::fstream::in); std::string location; std::string user_name; if (username.fail()) { username.open("username.txt", std::fstream::out); std::cout << "What's your system username? "; std::getline(std::cin, user_name); username << user_name; } else username >> user_name; username.close(); location = "/home/" + user_name + "/.config/openbox/autostart"; ... }De esta manera, como puede ver, le pido al usuario su nombre de usuario y lo agrego a la cadena de ubicación, ¿hay alguna manera fácil de encontrar el directorio de inicio del usuario sin solicitar la entrada del usuario? He intentado "~/..." y no funciona.
Sé que podría escanear el archivo "/etc/passwd" para encontrarlo desde allí, pero me pregunto si hay otra forma.
Su mejor apuesta aquí es probablemente usar la función getenv:
#include <stdlib.h> const char* homeDir = getenv("HOME");La variable de entorno $HOME generalmente siempre se establece en Linux, y le devolverá una cadena al directorio de inicio de un usuario (incluso cuando no esté en /home)
EDITAR: Esto solo funcionará para el directorio de inicio del usuario que ejecuta el programa. Si desea el directorio de inicio para un usuario diferente, deberá utilizar otro enfoque
EDIT2: En realidad, pensando en esto por más de 1 segundo... lo anterior funcionará, y deberías usarlo primero. Sin embargo, si HOME no está configurado, puede usar getpwuid:
#include <unistd.h> #include <sys/types.h> #include <pwd.h> const char *homedir = getenv("HOME"); if ( homedir == NULL ) { homedir = getpwuid(getuid())->pw_dir; }Si desea ir al directorio de inicio, simplemente use chdir("~")
demás,
Este es un truco sucio pero funciona.
#include <unistd.h> char currdir[100]; char homedir[100]; getcwd(currdir); //store the current directory in currdir chdir("~"); // change the working directory to user's home directory getcwd(homedir); // get the full address chdir(currdir); // go back to the previous directory