2016-02-23 3 views
3

Я пишу небольшой код C++ для доступа и редактирования определенного текстового файла в домашнем каталоге пользователя. В настоящее время я следующий код (это соответствующая часть):Доступ к домашнему каталогу пользователя linux с помощью fstream

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"; 
    ... 
} 

Таким образом, как вы можете видеть, я прошу у пользователя его имя пользователя и добавить его в строку местоположения, есть ли простой способ найти пользовательский домашний каталог без запроса ввода пользователя? Я пробовал «~/...», и он не работает.

Я знаю, что могу сканировать файл «/ etc/passwd», чтобы найти его оттуда, но мне интересно, есть ли другой способ.

+0

по умолчанию каталог находится в/home/user_name, но необязательно. Было бы разумнее читать/etc/passwd – Pooya

+0

Вам не нужно запрашивать у пользователя свое имя пользователя. В системах linux можно использовать 'chdir', чтобы сделать то же самое. Проверьте мой ответ ниже для полного раскрытия. Пожалуйста, примите, если это поможет! ;) –

ответ

3

Лучше всего здесь, вероятно, использовать функцию GetEnv:

#include <stdlib.h> 

const char* homeDir = getenv("HOME"); 

переменная HOME окружения $, как правило, всегда устанавливается под Linux, и он вернет вам строку в домашней директории пользователя (даже если это не под/home)

EDIT: Это будет работать только для домашнего каталога пользователя, запускающего программу. Если вам нужен домашний каталог для другого пользователя, вам нужно будет использовать другой подход.

EDIT2: На самом деле, думая об этом более 1 секунды ... выше будет работать, и вы должны использовать его в первую очередь. Однако, если HOME не установлена, вы можете использовать getpwuid:

#include <unistd.h> 
#include <sys/types.h> 
#include <pwd.h> 

const char *homedir = getenv("HOME"); 
if (homedir == NULL) { 
    homedir = getpwuid(getuid())->pw_dir; 
} 
+0

Оба подхода дают мне «/» вместо «/ home/MY_USERNAME», хотя я зарегистрирован как мой пользователь в системе, а не root. Вы знаете, что может быть проблемой? –

+0

Не совсем; Я просто запустил обе машины, и оба работали. Вы можете проверить, что HOME установлен, набрав «echo $ HOME» в терминале перед запуском приложения, но он должен быть установлен. Вы запускаете приложение из командной строки или через среду IDE? –

+0

Я запускал «echo $ HOME» и выводил правильный путь. Я запускаю свое приложение из командной строки, той же командной строки, с которой я запускал «echo $ HOME». –

1

Если вы хотите, чтобы перейти в домашний каталог, просто используйте chdir("~")

еще,

Это грязный хак, но работы

#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 
+0

Спасибо за это, я буду использовать «getenv (« HOME »), хотя, кажется, он намного чище. –

+0

running 'chdir (" ~ ")' - это только один вызов функции;) –

Смежные вопросы