如何使用 C++ 以跨平台方式找到用户的主目录?
如何在C++中以跨平台的方式找到用户的主目录?即 Linux 中的 /home/user、Windows Vista 中的 C:\Users\user\、Windows XP 中的 C:\Documents And Settings\user\ 以及 Mac 使用的任何内容。 (我认为它是 /User/user)
基本上,我正在寻找的是一种 C++ 方法(Python 中的示例)
os.path.expanduser("~")
How can I find the user's home directory in a cross platform manner in C++? i.e. /home/user in Linux, C:\Users\user\ on Windows Vista, C:\Documents And Settings\user\ on Windows XP, and whatever it is that Macs use. (I think it's /User/user)
Basically, what I'm looking for is a C++ way of doing this (example in python)
os.path.expanduser("~")
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为不可能用这个来完全隐藏 Windows/Unix 的鸿沟(除非 Boost 可能有一些东西)。
最可移植的方法必须是 Unix 上的
getenv("HOME")
并将getenv("HOMEDRIVE")
和getenv("HOMEPATH" 的结果连接起来)
(在 Windows 上)。I don't think it's possible to completely hide the Windows/Unix divide with this one (unless, maybe, Boost has something).
The most portable way would have to be
getenv("HOME")
on Unix and concatenating the results ofgetenv("HOMEDRIVE")
andgetenv("HOMEPATH")
on Windows.这个是可能的,找到它的最好方法就是研究
os.path.expanduser("~")
的源代码,复制起来真的很容易C 中具有相同的功能。您必须添加一些
#ifdef
指令来覆盖不同的系统。以下规则将为您提供
USERPROFILE
或者如果失败,请连接HOMEDRIVE
+HOMEPATH
HOME
或者如果失败,请使用getpwuid()
(示例代码)重要提示:许多人假设
HOME
环境变量在 Unix 上始终可用,但事实并非如此,OS X 就是一个很好的例子。 OS X 当您从 GUI(而不是控制台)运行应用程序时,不会设置此变量,因此您需要使用 getpwuid()。
This is possible, and the best way to find it is to study the source code of
os.path.expanduser("~")
, it is really easy to replicate the same functionality in C.You'll have to add some
#ifdef
directives to cover different systems.Here are the rules that will provide you the HOME directory
USERPROFILE
or if this fails, concatenateHOMEDRIVE
+HOMEPATH
HOME
or if this fails, usegetpwuid()
(example code)Important remark: many people are assuming that
HOME
environment variable is always available on Unix but this is not true, one good example would be OS X.On OS X when you run an application from GUI (not console) this will not have this variable set so you need to use the getpwuid().
主目录并不是真正的跨平台概念。您对配置文件目录根目录 (%USERPROFILE%) 的建议是一个合理的类比,但根据您拥有该目录后想要执行的操作,您可能需要应用程序数据目录之一或用户的“我的文档”。在 UNIX 上,您可以在主目录中创建一个隐藏的“.myapp”来保存文件,但这在 Windows 上是不正确的。
最好的选择是为每个平台编写特定的代码,以获取每种情况下所需的目录。根据您想要的正确程度,使用环境变量可能就足够了:UNIX 上的 HOME、Windows 上的 USERPROFILE 或 APPDATA(取决于您的需要)。
至少在 UNIX 上(任何 Windows 人员愿意发表评论吗?),如果设置了 HOME 环境变量,通常最好使用它,即使它与密码文件中特定的目录不一致。然后,在奇怪的情况下,当用户希望所有应用程序从不同的目录读取数据时,它仍然可以工作。
The home directory isn't really a cross-platform concept. Your suggestion of the root of the profile directory (%USERPROFILE%) is a fair analogy, but depending what you want to do once you have the directory, you might want one of the Application Data directories, or the user's My Documents. On UNIX, you might create a hidden ".myapp" in the home directory to keep your files in, but that's not right on Windows.
Your best bet is to write specific code for each platform, to get at the directory you want in each case. Depending how correct you want to be, it might be enough to use env vars: HOME on UNIX, USERPROFILE or APPDATA (depending what you need) on Windows.
On UNIX at least (any Windows folks care to comment?), it's usually good practice to use the HOME environment variable if it's set, even if it disagrees with the directory specific in the password file. Then, on the odd occasion when users want all apps to read their data from a different directory, it will still work.