Использование относительных путей к файлам в переносимом приложении C ++ - PullRequest
1 голос
/ 21 января 2010

Я занимаюсь разработкой портативного приложения на C ++.Среда разработки - Linux.У меня есть код, который загружает данные из файла XML и создает из него объектную модель.В настоящее время путь к файлу указан как /home/myuser/projectdir/xmlfilename.xml.Это проблематично, когда я использую другой компьютер, где имя домашнего каталога будет другим.Я пробовал что-то вроде ~/myuserprojectdir/xmlfilename.xml, но это не сработало.

Так есть ли стандартный метод определения имен файлов, который будет работать на разных платформах без каких-либо проблем?Или любой стандартный метод, который будет работать на машинах Linux?

Есть мысли?

Ответы [ 3 ]

2 голосов
/ 21 января 2010

Для переносимых путей вы можете использовать библиотеку файловых систем Boost.

http://www.boost.org/doc/libs/1_41_0/libs/filesystem/doc/index.htm

2 голосов
/ 21 января 2010

Вам нужно найти домашний каталог пользователя. Для этого используйте getpwent, чтобы получить запись пользователя и оттуда домашний каталог. Затем добавьте остаток пути к вашему XML-файлу /myuserprojectdir/xmlfilename.xml к полученному значению.

Это будет работать, даже если домашний каталог пользователя не /home/$USER. Он работает на Linux и OSX и, вероятно, будет работать на Windows с cygwin .

Вот рабочий пример с проверкой ошибок, опущенной для ясности :

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

main()
{
  char* user = getlogin();
  struct passwd* userrecord;
  while((userrecord = getpwent()) != 0)
    if (0 == strcmp(user, userrecord->pw_name))
      printf("save file is %s/myuserprojectdir/xmlfilename.xml\n", userrecord->pw_dir);
}

выход:

save file is /Users/alex/myuserprojectdir/xmlfilename.xml

Вот как это работает (с man getpwent):

struct passwd * getpwent(void);
  // The getpwent() function sequentially reads the password database and is intended for programs that wish to
 process the complete list of users.

   struct passwd {
               char    *pw_name;       /* user name */ // <<----- check this one
               char    *pw_passwd;     /* encrypted password */
               uid_t   pw_uid;         /* user uid */
               gid_t   pw_gid;         /* user gid */
               time_t  pw_change;      /* password change time */
               char    *pw_class;      /* user access class */
               char    *pw_gecos;      /* Honeywell login info */
               char    *pw_dir;        /* home directory */ // <<----- read this one
               char    *pw_shell;      /* default shell */
               time_t  pw_expire;      /* account expiration */
               int     pw_fields;      /* internal: fields filled in */
       };

Чтобы получить имя пользователя, используйте getlogin ... вот фрагмент из man getlogin.

char * getlogin(void);
  // The getlogin() routine returns the login name of the user associated with the current session ...
0 голосов
/ 21 января 2010

Или любой стандартный метод, который будет работать на компьютерах с Linux?

В Linux ознакомьтесь с Спецификацией XDG Base Directory с freedesktop.org. Он определяет местоположения для различных типов файлов, например данные, конфиг и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...