2

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

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

提前非常感谢!

4

2 回答 2

8

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

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

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

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

于 2010-02-20T11:26:00.230 回答
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 版本!

于 2010-02-20T12:35:25.270 回答