我正在尝试硬编码到程序中以在与可执行文件相同的目录中查找C++配置.ini,而不知道文件的完整路径。 我正在尝试找到一种方法来对可执行文件进行本地引用。
基本上加载("./config.ini"(不做
("C:\foo\bar\config.ini"(
实际上没有任何保证的可移植方法可以做到这一点,但我喜欢使用此代码,因为它适用于绝大多数情况(除非涉及符号链接或其他魔法(:
boost::filesystem::current_path(boost::filesystem::path(argv[0]).remove_filename());
如果你愿意使用特定于平台的代码,请查看Windows上的GetModuleFileName
和getpid
的混合,从Linux上的/proc
和readlink
中读取。
您希望在Windows上GetModuleFilename()
(传递NULL以获取当前可执行文件的文件名(。 否则,请在程序早期调用boost::filesystem::initial_path()
(请参阅链接中的 Boost 文档以了解尽早执行此操作的原因(。 这应该涵盖大多数情况。
编辑
脑功能障碍。 我们总是从可执行文件的目录中启动程序,所以boost::initial_path()
的事情有效,但如果你从另一个 direcory 启动程序,它就不会那么好用。 很抱歉对此感到困惑。 但是,在Windows上,我会从GetModuleFilename
获取路径并使用boost::path
来操作结果。
对于 windows,这将获取包含可执行的目录作为 c++ 字符串:
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;;
string ExePath() {
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
string::size_type pos = string( buffer ).find_last_of( "\/" );
return string( buffer ).substr( 0, pos);
}
然后,您可以在末尾标记配置文件的名称。
对于 Windows:
#include <direct.h>
char cur_path[FILENAME_MAX];
if (!_getcwd(cur_path, sizeof(cur_path)))
{
// deal with error
}
cur_path[sizeof(cur_path) - 1] = '/0'; // adding at the end of the string
printf("Current dir: %s", cur_path);
这里讨论了与平台无关的解决方案:
如何获取运行程序的目录?