如何使用C ++以跨平台方式查找用户的主目录?

时间:2010-03-31 11:23:46

标签: c++ cross-platform home-directory

如何在C ++中以跨平台方式查找用户的主目录?即Linux中的/ home / user,Windows Vista上的C:\ Users \ user \,Windows XP上的C:\ Documents And Settings \ user \以及Mac使用的任何内容。 (我认为是/用户/用户)

基本上,我正在寻找的是一种C ++方式(在python中的例子)

os.path.expanduser("~")

3 个答案:

答案 0 :(得分:27)

我认为用这个来完全隐藏Windows / Unix的区别是不可能的(除非Boost有一些东西)。

在Unix上,最便携的方式必须是getenv("HOME"),并在Windows上连接getenv("HOMEDRIVE")getenv("HOMEPATH")的结果。

答案 1 :(得分:17)

可能,找到它的最佳方法是研究os.path.expanduser("~")的源代码,在C中复制相同的功能非常容易。

您必须添加一些#ifdef指令以涵盖不同的系统。

以下是为您提供HOME目录的规则

  • Windows:env USERPROFILE或如果失败,请连接HOMEDRIVE + HOMEPATH
  • Linux,Unix和OS X:env HOME或如果失败,请使用getpwuid()example code

重要说明:很多人都认为HOME环境变量在Unix上始终可用,但事实并非如此,一个很好的例子就是OS X.

在OS X上从GUI(而不是控制台)运行应用程序时,不会设置此变量,因此您需要使用getpwuid()。

答案 2 :(得分:2)

主目录实际上不是跨平台的概念。您对配置文件目录的根目录(%USERPROFILE%)的建议是一个公平的类比,但是根据您拥有目录后要执行的操作,您可能需要一个Application Data目录或用户的My Documents。在UNIX上,您可以在主目录中创建一个隐藏的“.myapp”来保存您的文件,但这在Windows上不正确。

您最好的选择是为每个平台编写特定代码,以便在每种情况下获取所需的目录。根据您的想法,在Windows上使用env vars:HOME,UNIX,USERPROFILE或APPDATA(取决于您的需要)可能就足够了。

至少在UNIX上(任何Windows人员都要评论吗?),如果设置了HOME环境变量,通常是好的做法,即使它不同意密​​码文件中特定的目录。然后,在奇怪的情况下,当用户希望所有应用程序从不同的目录中读取他们的数据时,它仍然可以工作。