Ссылка на локальный файл Win API c ++ - PullRequest
1 голос
/ 31 мая 2011

Я пытаюсь жестко запрограммировать программу на C ++ для поиска config.ini в том же каталоге, что и исполняемый файл, не зная полного пути к файлу. Я пытаюсь найти способ сделать локальную ссылку на исполняемый файл.

Основная загрузка ("./config.ini") без выполнения

( "C: \ Foo \ бар \ config.ini")

Ответы [ 4 ]

2 голосов
/ 01 июня 2011

На самом деле нет никакого гарантированного переносимого способа сделать это, но мне нравится использовать этот код, потому что он работает в подавляющем большинстве случаев (если не используются символические ссылки или другая магия):

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

Если вы хотите использовать специфичный для платформы код, посмотрите на GetModuleFileName в Windows и сочетание getpid, читая из /proc и readlink в Linux.

1 голос
/ 01 июня 2011

Требуется GetModuleFilename() в Windows (передайте NULL, чтобы получить имя файла текущего исполняемого файла).В противном случае, вызовите boost::filesystem::initial_path() на ранней стадии программы (см. «Ускорение документации» по ссылке, чтобы узнать, как это сделать раньше)Это должно охватывать большинство ситуаций.

Редактировать

Неисправность мозга.Мы всегда запускаем наши программы из каталога исполняемого файла, поэтому функция boost::initial_path() работает, но она не будет работать так хорошо, если вы запустите программу из другого каталога.Извините за путаницу в этом.В Windows, однако, я получаю путь от GetModuleFilename и использую boost::path для управления результатом.

0 голосов
/ 01 июня 2011

Для 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);
}

Затем вы можете просто пометить имя вашего файла конфигурации в конце.

0 голосов
/ 01 июня 2011

Для 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);

Здесь обсуждалось независимое от платформы решение:

Как получить каталог, из которого запускается программа?

...