如何获取程序所在的目录?

25 浏览
0 Comments

如何获取程序所在的目录?

有没有一种平台无关且文件系统无关的方法,可以使用C/C++获取程序运行的完整目录路径?不要与当前工作目录混淆。(除非是标准库如clib或STL,否则请不要建议使用其他库。)\n(如果没有平台/文件系统无关的方法,也欢迎在Windows和Linux上为特定文件系统提供解决方案。)

0
0 Comments

问题的出现是因为需要获取程序正在运行的目录,然而不同操作系统的获取方法不同,需要针对不同的操作系统进行处理。

对于Windows操作系统,可以通过引入这两个头文件,并使用GetModuleFileName函数来获取程序的目录。具体代码如下:

#include 
#include 
std::string getexepath()
{
  char result[ MAX_PATH ];
  return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
}

对于Linux操作系统,可以通过引入这三个头文件,并使用readlink函数来获取程序的目录。具体代码如下:

#include 
#include 
#include 
std::string getexepath()
{
  char result[ PATH_MAX ];
  ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
  return std::string( result, (count > 0) ? count : 0 );
}

对于HP-UX操作系统,可以通过引入这五个头文件,并使用pstat_getproc和pstat_getpathname函数来获取程序的目录。具体代码如下:

#include 
#include 
#define _PSTAT64
#include 
#include 
#include 
std::string getexepath()
{
  char result[ PATH_MAX ];
  struct pst_status ps;
  if (pstat_getproc( &ps, sizeof( ps ), 0, getpid() ) < 0)
    return std::string();
  if (pstat_getpathname( result, PATH_MAX, &ps.pst_fid_text ) < 0)
    return std::string();
  return std::string( result );
}

需要注意的是,Windows的解决方法无法处理路径中的非ANSI字符,建议使用GetModuleFileNameW函数并显式转换为UTF-8编码(并在需要执行文件系统命令时再次转换回来)。

对于使用MinGW编译时出现的错误"error: cannot convert 'char*' to 'LPWCH {aka wchar_t*}' for argument '2' to 'DWORD GetModuleFileNameW(HMODULE, LPWCH, DWORD)'",可能是因为未正确定义使用宽字符版本的函数。解决方法是使用WCHAR代替char,并使用std::wstring代替std::string。

以上就是针对不同操作系统获取程序运行目录的解决方法。

0
0 Comments

如何获取程序所在的目录?

问题原因:想要获取程序所在的目录,而不是当前工作目录。因为如果程序是从命令提示符中运行的,那么它实际上是从命令提示符的当前工作目录中运行的,即使程序文件位于其他位置。

解决方法:使用getcwd函数来获取程序所在的目录。在Windows中,getcwd函数已被弃用,推荐使用_getcwd函数。下面是一个使用_getcwd函数获取程序所在目录的示例代码:

#include   /* 定义 FILENAME_MAX */
#ifdef _WIN32
    #include 
    #define GetCurrentDir _getcwd
#else
    #include 
    #define GetCurrentDir getcwd
#endif
char cCurrentPath[FILENAME_MAX];
if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
{
    return errno;
}
cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* 不是必需的 */
printf("The current working directory is %s", cCurrentPath);

此代码段使用了条件编译来区分Windows和其他平台,并使用不同的函数来获取当前目录。在Windows中,使用_getcwd函数获取当前目录,并将结果存储在cCurrentPath变量中,然后打印出来。

注意:在Mac OS上,getcwd函数似乎不会分配内存,而是会导致程序崩溃。因此,需要注意这一点。

通过使用getcwd或_getcwd函数,可以获取程序所在的目录,而不是当前工作目录。

0
0 Comments

如何获取程序所在目录的问题,出现的原因是用户想要获取程序所在目录的路径。解决方法是根据不同的操作系统使用不同的代码来获取程序所在目录的路径。

在Windows系统中,可以使用GetModuleFileName函数来获取程序所在目录的路径。代码如下:

char pBuf[256];
size_t len = sizeof(pBuf);
int bytes = GetModuleFileName(NULL, pBuf, len);
return bytes ? bytes : -1;

在Linux系统中,可以使用readlink函数来获取程序所在目录的路径。代码如下:

char pBuf[256];
size_t len = sizeof(pBuf);
int bytes = MIN(readlink("/proc/self/exe", pBuf, len), len - 1);
if(bytes >= 0)
    pBuf[bytes] = '\0';
return bytes;

这两种方法都可以获取程序所在目录的路径,适用于Windows和Linux系统。

在评论中,某些情况下了使用/proc/pid/exe在OS X系统上不被支持的问题。还有人对代码中使用/proc部分表示不满,认为不是所有的操作系统都是Linux,即使在Linux平台上,也应该考虑到/proc可能会因版本和架构的不同而发生变化。

还某些情况下了在Unix上获取二进制文件路径的更便携的方法是查看argv[0],但这种方法可能会被启动进程的进程伪造。因为argv[0]显示启动进程时使用的命令,所以只有当用户输入了完整的路径时,才会显示完整的路径。如果二进制文件在他们的PATH中,他们可以只输入foo来运行它,或者如果他们在当前目录中,可以输入./foo --无论哪种情况,argv[0]都是不足够的。

有人问道,在Linux上使用别名命令启动时,argv[0]是“命令名称”还是展开后的内容。还有人指出Windows的解决方案没有正确检查返回值(或者是期望调用者进行更多的错误检查)。此外,Windows的解决方案返回的是可执行文件的完整路径,如果只想要目录路径(正如问题所提),则需要从路径的末尾去掉文件名。

还有人建议在解决方案中添加char pBuf[256]; size_t len = sizeof(pBuf);以使代码更加清晰。

最后,有人感谢Mike并称他为英雄,还有人指出OS X不是Linux(它基于FreeBSD)。

这篇文章介绍了如何获取程序所在目录的问题的出现原因和解决方法。根据不同的操作系统,使用不同的代码来获取程序所在目录的路径。在Windows系统中,可以使用GetModuleFileName函数,在Linux系统中,可以使用readlink函数。这些方法都可以获得程序所在目录的路径,适用于不同的操作系统。

0