您好,
我正在寻找一种可移植的方法来查找程序的根目录(在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:\”)怎么办?
最终,目标是阅读与程序代码一起打包的一些预定义配置文件,而不强迫用户进入安装目录。
提前多多感谢!
答案 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版本!