如何在C ++中获取当前正在运行的可执行文件的文件名

时间:2012-09-03 23:16:23

标签: c++ filenames

我想获得当前流程的完整路径。

我使用_getcwd获取当前工作目录。但它不包括文件名。

如何获取文件名:filename.exe

8 个答案:

答案 0 :(得分:19)

你的主要功能的

argv[0]是你的文件名。

一个简单的代码段:

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

答案 1 :(得分:9)

在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

答案 2 :(得分:8)

在Linux上,二进制文件的文件名是/proc/self/exe符号链接的目标。您可以使用readlink系统调用来查找符号链接的目标。

请注意,这会告诉您存储二进制文件的磁盘上的实际位置,而不仅仅是用户用来启动程序的命令。

答案 3 :(得分:1)

您通常可以从argv[0]获取可执行文件名:

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

实际上,有一些方法可以将execl()另一个应用程序(或其他类似函数)应用于{{1}}并覆盖此参数。系统为这种应用改变它仍然是非常规的。

答案 4 :(得分:1)

在Linux(POSIX?)中有一个名为-(void)viewDidLoad{ [super viewDidLoad]; NSString *ipAddressText = @"192.168.211.62"; NSString *portText = @"12"; NSLog(@"Setting up connection to %@ : %i", ipAddressText, [portText intValue]); CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef) ipAddressText, [portText intValue], &readStream, &writeStream); messages = [[NSMutableArray alloc] init]; [self open]; UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedRightButton:)]; [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft]; [self.view addGestureRecognizer:swipeLeft]; UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tappedLeftButton:)]; [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight]; [self.view addGestureRecognizer:swipeRight]; // [delegate TCPSOCKET]; //ViewSwipe *theInstance = [[ViewSwipe alloc]init]; //[theInstance TCPSOCKET]; } - (IBAction)tappedRightButton:(id)sender { NSUInteger selectedIndex = [self.tabBarController selectedIndex]; [self.tabBarController setSelectedIndex:selectedIndex + 1]; //To animate use this code CATransition *anim= [CATransition animation]; [anim setType:kCATransitionPush]; [anim setSubtype:kCATransitionFromRight]; [anim setDuration:1]; [anim setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn]]; [self.tabBarController.view.layer addAnimation:anim forKey:@"fadeTransition"]; } - (IBAction)tappedLeftButton:(id)sender { NSUInteger selectedIndex = [self.tabBarController selectedIndex]; [self.tabBarController setSelectedIndex:selectedIndex - 1]; CATransition *anim= [CATransition animation]; [anim setType:kCATransitionPush]; [anim setSubtype:kCATransitionFromRight]; [anim setDuration:1]; [anim setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn]]; [self.tabBarController.view.layer addAnimation:anim forKey:@"fadeTransition"]; } 的环境变量,它包含当前进程。

_

在C ++中

$ echo $_
echo

编译

#include <stdlib.h>     /* getenv */
#include<iostream>
int main(){
    std::cout << getenv("_") << '\n';
    return 0;
}

打印$ c++ a.cpp -o a.out $ ./a.out (或执行的任何行,包括路径)。

与其他方法相比,它具有一定的优势,可以全局读取(不通过./a.out),也不需要文件处理。

答案 5 :(得分:1)

正如其他人所提到的,可执行文件的名称包含在argv [0]中。如果您需要,您可以:

cout << argv[0] << endl;

如果您需要可执行文件的源文件的名称,C ++有一个您可以使用的预定义宏:

cout << __FILE__ << endl;

Go to here并滚动到&#34;预定义的宏名称&#34;

答案 6 :(得分:1)

您可以使用errno.h中的program_invocation_name

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

答案 7 :(得分:0)

这是使用boost(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.