在开发过程中,常常遇到需要获取当前执行程序所在文件目录的情况,在不同操作系统上,获取程序所在目录的方法并不相同,本文介绍在Linux和Windows操作系统上获取该目录的方法。
Linux操作系统下获取执行程序所在目录的方法
在Linux操作系统中,我们可以通过访问/proc/$pid/目录下的文件来获取制定进程的信息。
为了方便获取本进程的信息,Linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时,获取的信息是不同的,内容等价于/proc/本进程pid/目录下的信息。
在该目录下,有一个符号链接exe,它指向当前的程序,我们可以通过readlink读取源路径的信息就可以获取当前程序的绝对路径。
下面提供Linux系统中获取程序所在目录的源代码:
char * get_exe_path()
{
char *path = malloc(1024 * sizeof(char));
int count = readlink("/proc/self/exe",path, 1024);
if( count < 0 )
{
*path = '\0';
free(path);
return NULL;
}
// 注意readlink不会字符串结尾添加'\0' 这个字符串结束标志
path[count] = '\0';
char *p = strrchr(path,'/');
*++p ='\0';
//printf("current working directory : %s\n",path);
return path;
}
Windows操作系统下获取程序所在目录的方法
在Windows操作系统下,我们可以通过调用GetModuleFileName,获取当前进程已加载的文件的完整路径,该模块必须由当前进程加载。
该函数原型如下:
DWORD GetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
其中,hModule为已加载模块的句柄。如果该参数为NULL,该函数返回当前应用程序的全路径。
lpFilename,是存放返回名字的内存块指针,是一个输出参数。
nSize,是lpFilename可装载的最大值。
由此,我们可以知道,当将hModule参数置为NULL,就可以获取当前执行程序路径。
下面给出Windows操作系统下获取程序所在目录的代码:
CString GetExecPath()
{
CString execPath;
TCHAR lpFileName[MAX_PATH];
int nSize = ::GetModuleFileName(NULL, lpFileName, MAX_PATH);
for (int i = nSize - 1; i > 0; i--)
{
if (lpFileName[i] == _T('\\'))
{
lpFileName[i+1] = 0;
break;
}
execPath = lpFileName;
}
return execPath;
}