Win API 本地文件参考 c++

发布于 2024-11-11 15:38:51 字数 159 浏览 3 评论 0原文

我试图将其硬编码到 C++ 程序中,以在与可执行文件相同的目录中查找 config.ini,而不知道该文件的完整路径。我正在尝试找到一种方法来对可执行文件进行本地引用。

基本上加载(“./config.ini”) 不执行

("C:\foo\bar\config.ini")

I am trying to hard code into C++ program to look for config.ini in the same directory as the executable, without knowing the complete path to the file. I am trying to find a way to make a local reference to the executable.

Basically load ("./config.ini")
without doing

("C:\foo\bar\config.ini")

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

遇见了你 2024-11-18 15:38:51

实际上并没有任何有保证的可移植方法来执行此操作,但我喜欢使用此代码,因为它在绝大多数情况下都有效(除非涉及符号链接或其他魔法):

boost::filesystem::current_path(boost::filesystem::path(argv[0]).remove_filename());

如果您愿意使用特定于平台的代码,请查看Windows 上的 GetModuleFileName 和 Linux 上的 getpid 的组合,从 /procreadlink 读取。

There isn't really any guaranteed portable way of doing this, but I like to use this code because it works in the vast majority of cases (unless symlinks or other magic is involved):

boost::filesystem::current_path(boost::filesystem::path(argv[0]).remove_filename());

If you are willing to use platform specific code look at GetModuleFileName on Windows and a mix of getpid, reading from /proc and readlink on Linux.

苍白女子 2024-11-18 15:38:51

您需要 GetModuleFilename() 在 Windows 上(传递 NULL 以获取当前可执行文件的文件名)。否则,调用 boost::filesystem: :initial_path() 在程序的早期(请参阅链接中的 Boost 文档,了解尽早执行此操作的原因)。这应该涵盖了大部分情况。

编辑

大脑功能障碍。我们总是从可执行文件的目录启动程序,因此 boost::initial_path() 可以工作,但如果从另一个目录启动程序,它就不会那么好用。很抱歉对此造成困惑。不过,在 Windows 上,我会从 GetModuleFilename 获取路径,并使用 boost::path 来操作结果。

You want GetModuleFilename() on Windows (pass NULL to get filename of current executable). Otherwise, call boost::filesystem::initial_path() early in the program (see Boost docs in link for the reason to do this early). That should cover most of the situations.

Edit

Brain malfunction. We always start our programs from the executable's directory, so the boost::initial_path() thing works, but it won't work so well if you start the program from another direcory. Sorry for the confusion on that. On Windows, though, I'd get the path from GetModuleFilename and use boost::path to manipulate the result.

清风疏影 2024-11-18 15:38:51

对于 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);
}

然后您可以在末尾标记配置文件的名称。

For windows, this will get the directory containing the excutable as a c++ string:

#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);
}

You can then just tag the name of your config file on the end.

初心 2024-11-18 15:38:51

对于 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 \0 at the end of the string

printf("Current dir: %s", cur_path);

此处讨论了与平台无关的解决方案:

如何获取程序运行的目录?

For 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 \0 at the end of the string

printf("Current dir: %s", cur_path);

A platform-agnostic solution was discussed here:

How do I get the directory that a program is running from?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文