打开相对于已执行模块的文件

时间:2011-02-01 13:49:56

标签: c++ io relative-path ifstream

我知道,打开一个文件限制它被放置在与执行模块相同的目录中并不是最好的主意。但是,有一个工具,我被命令编程,完全符合这些规范。

文件路径有一个参数,可以是文件的绝对路径,也可以是文件名,假设它位于当前目录中。

我不想使用WinAPI函数GetCurrentDirectory来保持可移植性。如果无法打开文件,该工具将失败。

通常我使用boost :: filesystem作为I / O库。因此,我对std-library不是很熟悉。

我的第一个想法是将文件路径传递给std :: ifstream :: open()。但似乎这对相对路径不起作用。

我可以做些什么来满足我的要求?

2 个答案:

答案 0 :(得分:3)

不幸的是,没有简单易用的方法可以做到这一点。特别是,GetCurrentDirectory可能不会返回与可执行模块相同的目录 - 在Windows上,只需打开一个通用对话框文件选择框就会导致当前目录发生变化!在其他平台上,你根本不可能在同一个目录中开始(那时你也可能没有写访问权限,但这也适用于现代windows ...)

在Windows上,一般情况下,您需要使用GetModuleFileName来查找模块的位置,然后剥离文件名部分。在Linux上,在readlink上为主可执行文件调用/proc/self/exe,或在/proc/self/maps中调用与动态库的代码段对应的映射。在其他操作系统上,我不知道。

答案 1 :(得分:-3)

只需传递相对文件名即可。它将相对于当前目录。