如何使用 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: env USERPROFILE 或者如果失败,连接HOMEDRIVE+HOMEPATH Linux、Unix 和 OS X:env HOME 或者如果失败,请使用 getpwuid() (example code)

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

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

【讨论】:

为什么我首先要尝试 userprofile ,如果失败则使用 homedrive 和 homepathh

以上是关于如何使用 C++ 以跨平台方式找到用户的主目录?的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 如何以独立于平台、线程安全的方式以用户首选的日期/时间语言环境格式格式化文件的最后修改日期和时间

如何找到可按组或其他人写入的主目录?

如何使用 Diesel 的主键以外的列找到值?

在 Boost Property 树库中,我如何以自定义方式处理文件未找到错误(C++)

如何使用 C++ 在 Windows 中获取硬件信息?

如何在 Windows 上获取用户主目录?