在便携式C ++应用程序上使用相对文件路径

时间:2010-01-21 17:20:53

标签: c++ cross-platform filenames

我正在开发一个可移植的C ++应用程序。开发环境是Linux。我有一个代码从Xml文件加载数据并从中创建一个对象模型。目前,文件路径以/home/myuser/projectdir/xmlfilename.xml提供。当我从主目录名称不同的其他计算机使用时,这是有问题的。我试过像~/myuserprojectdir/xmlfilename.xml这样的东西,但它没有用。

那么在定义文件名时是否有一种标准方法可以在各种平台上运行而没有任何问题?或者任何适用于Linux机器的标准方法?

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您需要找到用户的主目录。为此,请使用getpwent获取用户记录,并从那里获取主目录。然后将路径的其余部分添加到xml文件/myuserprojectdir/xmlfilename.xml中,直到你得到的值。

即使用户的主目录不是/home/$USER,这也会有效。它适用于Linux和OSX,可能适用于安装了cygwin的Windows。

这是一个工作示例,为清楚起见省略了错误检查

#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 ...

答案 1 :(得分:2)

对于可移植路径,您可能需要使用boosts Filesystem library。

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

答案 2 :(得分:0)

  

或者任何适用于Linux机器的标准方法?

在Linux上,从freedesktop.org查看XDG Base Directory Specification。它指定不同类型文件的位置,例如数据,配置等