代码之家  ›  专栏  ›  技术社区  ›  Macha

如何用C++跨平台的方式找到用户的家庭DIR?

  •  26
  • Macha  · 技术社区  · 14 年前

    如何在C++中以跨平台的方式找到用户的主目录?例如,Linux中的/home/user,Windows Vista中的c:\用户\用户,Windows XP中的c:\文档和设置\用户,以及Mac使用的任何内容。(我想是/用户/用户)

    基本上,我所要寻找的是一种C++方式来做这件事(Python中的例子)

    os.path.expanduser("~")
    
    3 回复  |  直到 6 年前
        1
  •  27
  •   Marcelo Cantos    14 年前

    我认为不可能用这个方法完全隐藏windows/unix之间的分歧(除非boost有什么东西)。

    最方便的方法是 getenv("HOME") 在unix上并连接 getenv("HOMEDRIVE") getenv("HOMEPATH") 在Windows上。

        2
  •  16
  •   Craig McQueen Dr. Watson    11 年前

    这个 是可能的 ,找到它的最佳方法是研究 os.path.expanduser("~") ,在c中复制相同的功能非常容易。

    你得加一些 #ifdef 涵盖不同系统的指令。

    以下是将为您提供主目录的规则

    • Windows:Env USERPROFILE 或者如果失败,连接 HOMEDRIVE + HOMEPATH
    • linux、unix和os x:env HOME 或者如果失败了,使用 getpwuid() ( example code )

    重要提示: 很多人认为 环境变量在UNIX上始终可用,但这不是真的 一个很好的例子就是OSX。

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

        3
  •  2
  •   Andy Mortimer    14 年前

    主目录并不是一个真正的跨平台概念。您对配置文件目录的根目录(user profile%)的建议是一个公平的类比,但是根据您拥有该目录后要执行的操作,您可能需要一个应用程序数据目录,或用户的“我的文档”。在Unix上,您可以在主目录中创建一个隐藏的“.myapp”来保存文件,但在Windows上这是不对的。

    你最好的办法是为每个平台编写特定的代码,在每种情况下都能找到你想要的目录。根据您希望的正确程度,在unix上使用env vars:home、在windows上使用userprofile或appdata(取决于您需要什么)可能就足够了。

    至少在unix上(有没有windows用户想发表评论?),如果设置了home环境变量,则通常使用它是很好的做法,即使它与密码文件中特定的目录不一致。然后,在用户希望所有应用程序从不同目录读取数据的奇怪情况下,它仍然可以工作。