現在のプロセスの完全なパスを取得したい。
私が使う _getcwd
現在の作業ディレクトリを取得します。ただし、ファイル名は含まれません。
次のようなファイル名を取得するにはどうすればよいですか:filename.exe
?
Windowsでは次を使用できます。
TCHAR szExeFileName[MAX_PATH];
GetModuleFileName(NULL, szExeFileName, MAX_PATH);
szExeFileNameには、フルパス+実行可能ファイルの名前が含まれます
[編集]
よりポータブルなソリューションについては、argv[0]
またはその他のプラットフォーム固有のコード。あなたはここでそのようなアプローチを見つけることができます: https://github.com/mirror/boost/blob/master/libs/log/src/process_name.cpp 。
メイン関数のargv[0]
はファイル名です。
簡単なコードスニペット:
#include<stdio.h>
int main(int argc,char** argv)
{
//access argv[0] here
}
Linuxでは、バイナリのファイル名は/proc/self/exe
のシンボリックリンクの宛先です。 readlink
システムコールを使用して、シンボリックリンクの宛先を見つけることができます。
これは、ユーザーがプログラムを起動するために使用したコマンドだけではなく、バイナリが格納されているディスク上の実際の場所を示していることに注意してください。
これは、ブーストを使用したクロスプラットフォームの方法です( https://www.boost.org/ )
#include <iostream>
#include <boost/dll.hpp>
int main( int argc, char **argv ) {
std::cout << "hello world, this is [" << boost::dll::program_location().filename().string() << "]" << std::endl;
std::cout << "or [" << boost::dll::program_location().string() << "] if you're not into the whole brevity thing." << std::endl;
return 0;
}
経由でコンパイル
g++ -o hello_world hello_world.cpp -lboost_filesystem -lboost_system -ldl
出力結果
hello world, this is [hello_world]
or [/home/gjvc/tmp/hello_world] if you're not into the whole brevity thing.
Linux(POSIX?)には、現在のプロセスを含む_
という環境変数があります。
$ echo $_
echo
C++では
#include <stdlib.h> /* getenv */
#include<iostream>
int main(){
std::cout << getenv("_") << '\n';
return 0;
}
コンパイル
$ c++ a.cpp -o a.out
$ ./a.out
./a.out
(またはパスを含む実行された行は何でも)を出力します。
これには他のアプローチに比べて特定の利点があり、グローバルに読み取ることができ(argv[0]
を渡さない)、ファイル処理を必要としません。
通常、実行可能ファイル名は_argv[0]
_から取得できます。
_#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Running: %s\n", argv[0]);
return 0;
}
_
実際、アプリケーションが別のアプリケーション(または別の同様の関数)をexecl()
して、この引数をオーバーライドする方法があります。そのようなアプリケーションのためにシステムがそれを変更することはまだ慣例的ではありません。
Errno.hのprogram_invocation_nameを使用できます
他の人が述べたように、あなたの実行可能ファイルの名前はargv [0]に含まれています。それが必要な場合は、次のことができます。
cout << argv[0] << endl;
実行可能ファイルのソースファイルの名前が必要な場合、C++には、使用できる事前定義されたマクロがあります。
cout << __FILE__ << endl;
ここに移動 し、「定義済みマクロ名」までスクロールします