如何使用 C++ 以跨平台方式找到用户的主目录?
Posted
技术标签:
【中文标题】如何使用 C++ 以跨平台方式找到用户的主目录?【英文标题】:How can I find the user's home dir in a cross platform manner, using C++? 【发布时间】:2011-02-02 21:22:09 【问题描述】:如何在 C++ 中以跨平台的方式找到用户的主目录?即 Linux 中的 /home/user,Windows Vista 上的 C:\Users\user\,Windows XP 上的 C:\Documents And Settings\user\,以及 Mac 使用的任何内容。 (我认为是 /User/user)
基本上,我正在寻找的是一种 C++ 方法(python 中的示例)
os.path.expanduser("~")
【问题讨论】:
跨平台,你不能。标准 C++ 没有这样的功能。 检查我的答案,有一个跨平台的方式:你使用#ifdef
:D 实现它
另见***.com/questions/2910377/…
【参考方案1】:
我认为用这个来完全隐藏 Windows/Unix 的鸿沟是不可能的(除非,也许 Boost 有什么东西)。
最便携的方式必须是 Unix 上的 getenv("HOME")
并在 Windows 上连接 getenv("HOMEDRIVE")
和 getenv("HOMEPATH")
的结果。
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
【讨论】:
+1 这或多或少是 Qt 在QDir::homepath()
中所做的:doc.trolltech.com/4.6/qdir.html#homePath。可能也要检查他们的来源。
请注意。 QT 显然返回CSIDL_PROFILE
。在我的电脑上,这是一个不同的目录。 (%HOMEDRIVE%
在文件服务器上,CSIDL_PROFILE
不在。)
@MSalters:刚刚检查了我稍微过时的 Qt 安装的来源:在 Windows 上,检查“HOME”、“USERPROFILE”、“HOMEDRIVE”。在 Unix 上,只需尝试“HOME”。如果未设置,则返回根路径。
更新了QDir::homePath()
qt-project.org/doc/qt-5/qdir.html#homePath的文档链接
这是一种在将 HOME= 设置为其他值之前获得真正家的方法吗?【参考方案2】:
主目录并不是真正的跨平台概念。您对配置文件目录 (%USERPROFILE%) 根目录的建议是一个公平的类比,但是根据您在拥有该目录后想要执行的操作,您可能需要应用程序数据目录之一或用户的我的文档。在 UNIX 上,您可以在主目录中创建一个隐藏的“.myapp”来保存您的文件,但在 Windows 上这是不对的。
您最好的选择是为每个平台编写特定的代码,以便在每种情况下都获得您想要的目录。根据您想要的正确程度,使用 env vars 可能就足够了:UNIX 上的 HOME,Windows 上的 USERPROFILE 或 APPDATA(取决于您需要什么)。
至少在 UNIX 上(任何 Windows 人员愿意评论?),如果设置了 HOME 环境变量,即使它与密码文件中的特定目录不一致,通常也是一个好习惯。然后,在用户希望所有应用程序从不同目录读取数据的奇怪情况下,它仍然可以工作。
【讨论】:
【参考方案3】:这个是可能的,找到它的最好方法是研究os.path.expanduser("~")
的源代码,用C复制同样的功能真的很容易。
您必须添加一些 #ifdef
指令来覆盖不同的系统。
以下是为您提供 HOME 目录的规则
Windows: envUSERPROFILE
或者如果失败,连接HOMEDRIVE
+HOMEPATH
Linux、Unix 和 OS X:env HOME
或者如果失败,请使用 getpwuid()
(example code)
重要说明:很多人认为HOME
环境变量在 Unix 上始终可用,但事实并非如此,一个很好的例子就是 OS X。
在 OS X 上,当您从 GUI(而非控制台)运行应用程序时,不会设置此变量,因此您需要使用 getpwuid()。
【讨论】:
为什么我首先要尝试 userprofile ,如果失败则使用 homedrive 和 homepathh以上是关于如何使用 C++ 以跨平台方式找到用户的主目录?的主要内容,如果未能解决你的问题,请参考以下文章
C++ - 如何以独立于平台、线程安全的方式以用户首选的日期/时间语言环境格式格式化文件的最后修改日期和时间