C ++以编程方式查找可执行根目录的便携方式

时间:2010-02-20 11:20:47

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

  

可能重复:
  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:\”)怎么办?

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

提前多多感谢!

2 个答案:

答案 0 :(得分:8)

没有可移植的方式。 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上使用。)

答案 1 :(得分:1)

没有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版本!