如何在C ++中以跨平台方式查找用户的主目录?即Linux中的/ home / user,Windows Vista上的C:\ Users \ user \,Windows XP上的C:\ Documents And Settings \ user \以及Mac使用的任何内容。 (我认为是/用户/用户)
基本上,我正在寻找的是一种C ++方式(在python中的例子)
os.path.expanduser("~")
答案 0 :(得分:27)
我认为用这个来完全隐藏Windows / Unix的区别是不可能的(除非Boost有一些东西)。
在Unix上,最便携的方式必须是getenv("HOME")
,并在Windows上连接getenv("HOMEDRIVE")
和getenv("HOMEPATH")
的结果。
答案 1 :(得分:17)
可能,找到它的最佳方法是研究os.path.expanduser("~")
的源代码,在C中复制相同的功能非常容易。
您必须添加一些#ifdef
指令以涵盖不同的系统。
以下是为您提供HOME目录的规则
USERPROFILE
或如果失败,请连接HOMEDRIVE
+ HOMEPATH
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环境变量,通常是好的做法,即使它不同意密码文件中特定的目录。然后,在奇怪的情况下,当用户希望所有应用程序从不同的目录中读取他们的数据时,它仍然可以工作。