現在のプロセスのフルパスを取得したいと思います。
_getcwd
現在の作業ディレクトリを取得するために使用します。ただし、ファイル名は含まれていません。
次のようなファイル名を取得するにはどうすればよいfilename.exe
ですか?
argv[0]
あなたの主な機能のはあなたのファイル名です。
簡単なコードスニペット:
#include<stdio.h>
int main(int argc, char** argv)
{
//access argv[0] here
}
main()でコードにアクセス/変更できない場合は、次のようにすることができます。
std::string executable_name()
{
#if defined(PLATFORM_POSIX) || defined(__linux__) //check defines for your setup
std::string sp;
std::ifstream("/proc/self/comm") >> sp;
return sp;
#elif defined(_WIN32)
char buf[MAX_PATH];
GetModuleFileNameA(nullptr, buf, MAX_PATH);
return buf;
#else
static_assert(false, "unrecognized platform");
#endif
}
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にあります。
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.
他の人が述べているように、実行可能ファイルの名前はargv[0]に含まれています。それが必要な場合は、次のことができます。
cout << argv[0] << endl;
実行可能ファイルのソースファイルの名前が必要な場合、C++には使用できる定義済みのマクロがあります。
cout << __FILE__ << endl;
ここに移動して、「事前定義されたマクロ名」までスクロールします
errno.hからprogram_invocation_nameを使用できます
通常、実行可能ファイル名は次の場所から取得できますargv[0]
。
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Running: %s\n", argv[0]);
return 0;
}
実際、アプリケーションをexecl()
別のアプリケーション(または別の同様の関数)に適用し、この引数をオーバーライドする方法があります。システムがその種のアプリケーションのためにそれを変更することはまだ型破りです。
_
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]
)、ファイル処理を必要としません。