私は、ファイルへの完全なパスを知らずに、実行可能ファイルと同じディレクトリにconfig.iniを探すためにC++プログラムにハードコードを作成しようとしています。私は実行可能ファイルへのローカル参照を作成する方法を見つけることを試みています。Win APIローカルファイルリファレンスC++
基本的に負荷( "./config.ini ")
やっなし(" C:\ fooという\バー\ config.iniのを")
私は、ファイルへの完全なパスを知らずに、実行可能ファイルと同じディレクトリにconfig.iniを探すためにC++プログラムにハードコードを作成しようとしています。私は実行可能ファイルへのローカル参照を作成する方法を見つけることを試みています。Win APIローカルファイルリファレンスC++
基本的に負荷( "./config.ini ")
やっなし(" C:\ fooという\バー\ config.iniのを")
あなたが欲しいGetModuleFilename()
Windows上で(現在の実行ファイルのファイル名を取得するにはNULLを渡します)。それ以外の場合は、プログラムの早い段階でboost::filesystem::initial_path()
に電話してください(これを早期に行う理由については、リンクのBoost docsを参照してください)。それはほとんどの状況をカバーするはずです。
編集
脳の機能不全。実行可能ファイルのディレクトリからプログラムを起動するので、boost::initial_path()
が動作しますが、別のdirecoryからプログラムを起動するとうまく動作しません。そのことを混乱させて申し訳ありません。 Windowsでは、私はGetModuleFilename
からのパスを取得し、boost::path
を使用して結果を操作します。 Windows用の
のいずれかの保証はポータブルな方法は本当にありませんこれを行うが、それはほとんどの場合に動作しますので、私は(シンボリックリンクやその他の魔法が関与しなければ)このコードを使用したい:
boost::filesystem::current_path(boost::filesystem::path(argv[0]).remove_filename());
あなたがWindows上GetModuleFileName
で、プラットフォーム固有のコードを見て使用して喜んでいる場合との組み合わせ、Linuxの/proc
およびreadlink
からの読み取り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);
:
彼は現在の作業ディレクトリを取得する方法を求めていませんが、実行可能ファイルのディレクトリを取得する方法については問いません。 – xDD
OPはこのチェックを自分のアプリケーションにハードコードします。アプリケーションが実行されるたびに、_getcwd()は現在のディレクトリ(config.iniがあるディレクトリ)を返します。 – karlphillip
、これはC++文字列としてexcutableを含むディレクトリを取得します:
#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);
}
その後、ちょうど最後に、あなたの設定ファイルの名前にタグを付けることができます。
'GetModuleFilename'は正しい動作をしますが、実行可能ファイルを含むディレクトリとは異なるCWDを持つプロセスを開始するのは簡単なので、' initial_path() 'は役に立ちません。 – ildjarn
これを書いていたときにその効果を編集していなければなりません。ありがとう。 – gregg