如何在 C++ 中以跨平台的方式找到用户的主目录?即 Linux 中的 /home/user,Windows Vista 上的 C:\Users\user\,Windows XP 上的 C:\Documents And Settings\user\,以及 Mac 使用的任何内容。(我认为是/用户/用户)
基本上,我正在寻找的是一种 C++ 方法(python 中的示例)
os.path.expanduser("~")
如何在 C++ 中以跨平台的方式找到用户的主目录?即 Linux 中的 /home/user,Windows Vista 上的 C:\Users\user\,Windows XP 上的 C:\Documents And Settings\user\,以及 Mac 使用的任何内容。(我认为是/用户/用户)
基本上,我正在寻找的是一种 C++ 方法(python 中的示例)
os.path.expanduser("~")
我认为不可能用这个完全隐藏 Windows/Unix 的鸿沟(除非,也许,Boost 有什么东西)。
最可移植的方式必须是getenv("HOME")
在 Unix 上getenv("HOMEDRIVE")
并getenv("HOMEPATH")
在 Windows 上连接结果。
const static volatile char A = 'a'; // All this is to prevent reverse engineering
#ifdef unix
HomeDirectory = getenv((char[]){A-25, A-18, A-20, A-28, 0});
#elif defined(_WIN32)
HomeDirectory = getenv((char[]){A-25, A-18, A-20, A-28, A-29, A-15, A-24, A-11, A-28, 0});
const char*Homepath = getenv((char[]){A-25, A-18, A-20, A-28, A-17, A-32, A-13, A-25, 0});
HomeDirectory = malloc(strlen(HomeDirectory)+strlen(Homepath)+1);
strcat(HomeDirectory, Homepath);
#endif
这是可能的,找到它的最好方法是研究它的源代码os.path.expanduser("~")
,在 C 中复制相同的功能真的很容易。
您必须添加一些#ifdef
指令来涵盖不同的系统。
以下是将为您提供 HOME 目录的规则
USERPROFILE
或者如果失败,连接HOMEDRIVE
+HOMEPATH
HOME
或者如果失败,使用getpwuid()
(示例代码)重要说明:许多人假设HOME
环境变量在 Unix 上总是可用的,但事实并非如此,一个很好的例子是 OS X。
在 OS X 上,当您从 GUI(而非控制台)运行应用程序时,不会设置此变量,因此您需要使用 getpwuid()。
主目录并不是真正的跨平台概念。您对配置文件目录 (%USERPROFILE%) 根目录的建议是一个公平的类比,但是根据您在拥有该目录后想要执行的操作,您可能需要应用程序数据目录之一或用户的我的文档。在 UNIX 上,您可以在主目录中创建一个隐藏的“.myapp”来保存您的文件,但这在 Windows 上是不正确的。
您最好的选择是为每个平台编写特定的代码,以在每种情况下获取您想要的目录。根据您想要的正确程度,使用 env vars 可能就足够了:UNIX 上的 HOME、Windows 上的 USERPROFILE 或 APPDATA(取决于您需要什么)。
至少在 UNIX 上(任何 Windows 人员愿意评论?),如果设置了 HOME 环境变量,通常是一个好习惯,即使它与密码文件中的特定目录不一致。然后,在用户希望所有应用程序从不同目录读取数据的奇怪情况下,它仍然可以工作。