假设源代码文件名是test.cpp.编译时,它会生成test.exe文件.当我执行它时,它应该识别它的文件名test.exe并打印它.
我可以使用以下代码获取当前目录中存在的所有文件和目录的列表:
DIR * directory;
struct dirent * direct;
direct = readdir(directory);
Run Code Online (Sandbox Code Playgroud)
但是,如何识别相关的文件名,在这种情况下是哪个"test.exe"?
gal*_*tte 16
在main函数中,argv[0]是命令行中可执行文件的名称
#include <stdio.h>
int main(int argc, char ** argv)
{
printf("%s", argv[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将打印命令名称,即相对于当前工作目录的目录,以及可执行文件名称(如果可用,这是不可保证的)要获取当前工作目录,请使用getcwd()标准库C函数.
从命令路径中提取文件名argv[0]是特定于平台的:unix使用斜杠' /',windows允许混合使用斜杠/和反斜杠\,而任何其他平台都可以使用任何其他路径分隔符.从路径中提取文件名需要跨平台库,例如Qt或Boost.在POSIX环境中,可以使用basename.
Dav*_*eri 11
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%s\n", argv[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您的程序可以启动为:
/home/user/./app
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以使用strrchr以下命令获取名称:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *appname;
appname = strrchr(argv[0], '/'); /* '\\' on Windows */
printf("%s\n", appname ? ++appname : argv[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您在构建可执行文件时知道它的名称; 最简单的解决方案是将其嵌入到程序中,使用-D或/D
选项在命令行上定义宏.
除此之外,通用答案是不可能的:
根据标准
argv[0]应该包含用于调用程序的名称(无论这意味着什么).哪个好,但1)它甚至不能在Unix下实现,2)在大多数系统中,存在各种别名,这意味着用于调用程序的名称与可执行文件的名称无关.在Windows下
- 有一个系统函数
GetModuleFileName可用于获取可执行文件的路径.获得路径后,路径的最后一个元素就是可执行文件的名称.在Unix下
- 这根本不可能.在启动一个新进程时,Unix会为可执行文件的路径采用单独的参数,并为最终进程提供参数
argv[0],因此它们可能彼此之间没有任何关系.这一切都取决于谁开始你的过程.bash将在环境变量中放置可执行文件的完整路径"_",以便您可以使用getenv它来获取它.但这只适用于您的程序启动时bash.在大多数Unices上,你也可以在/proc文件系统中找到它 ,如果你知道你的方式; 但是这种组织方式因Unix而异.另请注意,由于硬链接,您可执行文件可能没有一个名称.
真正的问题是你想要这样做的原因.你想解决的问题是什么?
| 归档时间: |
|
| 查看次数: |
6731 次 |
| 最近记录: |