19

現在のプロセスのフルパスを取得したいと思います。

_getcwd現在の作業ディレクトリを取得するために使用します。ただし、ファイル名は含まれていません。

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

4

8 に答える 8

29

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
}
于 2012-09-03T23:18:01.997 に答える
17

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にあります。

于 2012-09-04T00:17:54.833 に答える
9

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

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

于 2012-09-03T23:40:49.073 に答える
5

これがブーストを使用したクロスプラットフォームの方法です(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.
于 2018-09-25T09:55:36.307 に答える
3

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

cout << argv[0] << endl;

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

cout << __FILE__ << endl;

ここに移動して、「事前定義されたマクロ名」までスクロールします

于 2017-02-02T04:51:00.763 に答える
2

errno.hからprogram_invocation_nameを使用できます

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

于 2017-06-28T11:27:17.450 に答える
1

通常、実行可能ファイル名は次の場所から取得できますargv[0]

#include <stdio.h>
int main(int argc, char* argv[])
{
 printf("Running: %s\n", argv[0]);
 return 0;
}

実際、アプリケーションをexecl()別のアプリケーション(または別の同様の関数)に適用し、この引数をオーバーライドする方法があります。システムがその種のアプリケーションのためにそれを変更することはまだ型破りです。

于 2012-09-03T23:19:18.237 に答える
1

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

于 2016-04-29T21:51:44.323 に答える