【问题标题】:C++ Portable way of programmatically finding the executable root directory [duplicate]以编程方式查找可执行根目录的C ++便携式方法[重复]
【发布时间】:2010-02-20 11:20:47
【问题描述】:

可能重复:
how to find the location of the executable in C

嗨,

我正在寻找一种可移植的方式来查找程序的根目录(在 C++ 中)。例如,在 Linux 下,用户可以将代码复制到 /opt,将其添加到 PATH,然后执行它:

cp -r my_special_code /opt/
export PATH=${PATH}:/opt/my_special_code/
cd /home/tony/
execution_of_my_special_code

(其中“execute_my_special_code”是 /opt/my_special_code 中的程序)。

现在,作为“execution_of_my_special_code”的开发人员,是否有一种可移植的编程方式来找出可执行文件在 /opt/my_special_code 中?

第二个例子是在 MS Windows 上:如果我当前的工作目录在一个硬盘上(例如“C:\”),而可执行文件放在另一个硬盘上(例如“D:\”)怎么办?

最终的目标是读取一些与程序代码打包在一起的预定义配置文件,而不需要强制用户进入安装目录。

提前非常感谢!

【问题讨论】:

标签: c++ configuration-files execution working-directory


【解决方案1】:

没有可移植的方式来做到这一点。 C 和 C++ 标准都不需要 argv 数组来保存此信息,并且在提供它的标准库中没有库例程。

您将需要找到一种非便携的方式以特定于平台的方式获取此信息,例如 Windows 下的GetModuleFileName 或 Linux 下的阅读/proc/self/exe

无论如何,将配置信息与可执行文件一起存储实际上是个坏主意,因为这意味着它对所有用户都是一样的。执行此操作的 UNIX 方法是将特定于程序的信息存储在 /etc 树中,并将特定于用户的信息存储在用户的主目录中。例如,对于名为dodgybob 的应用程序,用户的配置文件可以称为$HOME/.dodgybob$HOME/.dodgybobrc

对于 Windows,您应该将特定于程序的信息存储在注册表 (HKLM) 中,并将用户特定的信息存储在注册表 (HKCU) 或用户自己的区域(例如,Documents & Settings\<username>\Local Settings,尽管这样做是正确的方法即 SHGetSpecialFolderPath 传递 CSIDL_APPDATA 或(Vista 及更高版本)具有已知文件夹 ID,尽管旧方法仍可在 Vista 上作为存根函数使用)。

【讨论】:

  • 也许 AppData 会更好?
  • 别忘了"Documents & Settings\<username>\Local Settings" 在本地化版本的Windows 中的命名方式不同。因此,请使用与语言环境无关的方式来查找它,而不是仅仅写入该名称的目录。
  • 我完全同意命令用户配置是一个坏主意。另一方面,我打算在编译的源代码之外为它们呈现预定义的值(当然,这些值可以被单独的配置覆盖)。感谢所有的答案!
【解决方案2】:

没有 ISO c++ 代码,但您可以进行条件编译并使用 _getcwd (Windows) 或 getcwd (Linux):

#define GetCurrentDir _getcwd
std::string SettingsHandler::getFullPath() {
    char chPath[2048];

    if (!GetCurrentDir(chPath, sizeof(chPath))) {
        return "ERROR";
    }

    chPath[sizeof(chPath) - 1] = '/0';

    return chPath;
}

由于您想要进行跨平台编程,您应该将您的设置/配置存储在一个 xml 文件中。这样您就不必创建两个解析器(一个用于注册表,另一个用于 linux 解决方案)并且您不必处理不同的 Windows 版本!

【讨论】:

  • 不——工作目录不是安装目录。
猜你喜欢
  • 2013-08-08
  • 2023-03-17
  • 2017-04-27
  • 2011-09-28
  • 1970-01-01
  • 2023-04-08
  • 2013-11-16
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多