在C/C++中是否有办法找到当前执行程序的位置(完整路径)?
(问题argv[0]在于它没有给出完整的路径.)
我知道之前已经问过这个问题,但我还没有看到一个令人满意的答案,或者一个明确的"不,这不可能完成",所以我再问一次!
我想做的就是以独立于平台的方式获取当前运行的可执行文件的路径,作为绝对路径或相对于调用可执行文件的位置.我虽然boost :: filesystem :: initial_path是我的麻烦的答案,但似乎只处理问题的'平台无关'部分 - 它仍然返回调用应用程序的路径.
对于一些背景,这是一个使用Ogre的游戏,我试图使用Very Sleepy进行配置,它从自己的目录运行目标可执行文件,所以当然在加载时游戏找不到配置文件等,并立即崩溃.我希望能够将它传递给配置文件的绝对路径,我知道配置文件将始终与可执行文件一起存在.在Visual Studio中进行调试也是如此 - 我希望能够运行$(TargetPath)而无需设置工作目录.
看看这个伪代码:
string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path
Run Code Online (Sandbox Code Playgroud)
如果我构建上述程序并将可执行文件放入C:/meow/其中This executable is located in C:/meow/,则无论当前工作目录如何,它都会在每次运行时打印出来.
我怎么能轻易地完成这个使用C#?
我使用Go为各种平台编译一个程序,并通过调用相对路径或仅通过其名称(如果它在PATH变量中)来运行它.
是否有可能找出可执行文件的位置?
说,我的程序叫做" foo(.exe)".我可以运行./foo,foo(如果它在PATH) ../../subdir/subdir/foo.
我试过使用os.Args[0],我想我应该检查程序名称是否包含除"foo"之外的其他内容.如果是,则使用filepath.Abs,如果不是,则使用(我找不到函数名称,有一个函数可以通过PATH查看程序的位置).
在Linux上,应用程序可以通过查询轻松获得其绝对路径/proc/self/exe.在FreeBSD上,它更复杂,因为你必须建立一个sysctl调用:
int mib[4];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PATHNAME;
mib[3] = -1;
char buf[1024];
size_t cb = sizeof(buf);
sysctl(mib, 4, buf, &cb, NULL, 0);
Run Code Online (Sandbox Code Playgroud)
但它仍然是完全可行的.然而,我找不到在OS X上为命令行应用程序确定这一点的方法.如果您是在应用程序包中运行[[NSBundle mainBundle] bundlePath],则可以通过运行来确定它,但由于命令行应用程序不在捆绑包中,因此无效.
(注意:咨询argv[0]不是一个合理的答案,因为,如果从符号链接启动,argv[0]将是那个符号链接 - 不是所谓的可执行文件的最终路径.argv[0]如果一个哑的应用程序使用一个exec()调用而忘记正确初始化argv ,也可能会失败 我在野外见过的.)
如何从流程ID获取流程详细信息,如应用程序名称和应用程序的实际路径?
我使用的是Mac OS X.
如何在运行时获取当前运行的JVM的可执行文件的位置?我想使用ProcessBuilder类将另一个JVM实例化为子进程.
我知道有java.homeSystem属性,但是这并没有指定JVM可执行文件的位置.我知道我可以做这样的事情来获得路径:
System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"
此代码与平台无关,因为Windows可执行文件的名称java.exe不是java.有没有办法获取JVM可执行文件的路径,将平台的特性考虑在内?
我有这个要求,我需要从内部找到C++程序的完整路径.对于Windows,我有以下解决方案.argv [0]可能包含也可能不包含完整路径.但我需要确定.
TCHAR drive[_MAX_DRIVE], dir[_MAX_DIR], base[_MAX_FNAME], ext[_MAX_EXT];
TCHAR fullPath[255+1];
_splitpath(argv[0],drive,dir,base,ext);
SearchPath(NULL,base,ext,255,fullPath,NULL);
Run Code Online (Sandbox Code Playgroud)
什么是上述代码的Linux(gcc)等价物?很想看到可移植的代码.
所以我运行我的应用程序.我需要知道它的可执行文件在哪里.如何使用Boost.Filesystem找到它的路径?
在我被标记为重复之前,我能找到的所有类似问题在引入 std::filesystem 之前都有答案,并且使用特定于平台的代码或 Boost::filesystem。我正在寻找一个使用 std::filesystem 的便携式答案。
是否可以使用 std::filesystem 获取 C++ 可执行文件所在的路径(而不是工作目录)?如果是的话,怎么样?