web-dev-qa-db-ja.com

C ++で現在実行中の実行可能ファイルのファイル名を取得する方法

現在のプロセスの完全なパスを取得したい。

私が使う _getcwd現在の作業ディレクトリを取得します。ただし、ファイル名は含まれません。

次のようなファイル名を取得するにはどうすればよいですか:filename.exe

14
Phat Tran

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

10
marcinj

メイン関数のargv[0]はファイル名です。

簡単なコードスニペット:

#include<stdio.h>
int main(int argc,char** argv)
{
//access argv[0] here
}
21

Linuxでは、バイナリのファイル名は/proc/self/exeのシンボリックリンクの宛先です。 readlinkシステムコールを使用して、シンボリックリンクの宛先を見つけることができます。

これは、ユーザーがプログラムを起動するために使用したコマンドだけではなく、バイナリが格納されているディスク上の実際の場所を示していることに注意してください。

9
Ken Bloom

これは、ブーストを使用したクロスプラットフォームの方法です( 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.
1
gjvc

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]を渡さない)、ファイル処理を必要としません。

1
alfC

通常、実行可能ファイル名は_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を使用できます

https://linux.die.net/man/3/program_invocation_short_name

1
vromanov

他の人が述べたように、あなたの実行可能ファイルの名前はargv [0]に含まれています。それが必要な場合は、次のことができます。

cout << argv[0] << endl;

実行可能ファイルのソースファイルの名前が必要な場合、C++には、使用できる事前定義されたマクロがあります。

cout << __FILE__ << endl;

ここに移動 し、「定義済みマクロ名」までスクロールします

1
user6866749