在项目中经常要用到配置文件或日志文件,而这些文件通常和应用程序放在同一目录中,所以必须得到当前执行应用程序的目录。
方法一:GetCurrentDirectory() 函数,其原型如下:
DWORD GetCurrentDirectory(
DWORD nBufferLength, // size of directory buffer
LPTSTR lpBuffer // directory buffer
);
该函数包含在”winbase.h”头文件中。
有网友反映,说GetCurrentDirectory()函数得到应用程序目录不安全,假设应用程序在“D:\test”目录下,当我们用了CFileDialog来打开一个文件,如“C:\test\1.txt”,此时再用该函数时得到的值将变为”C:\test”,但本人在VS2008上测试,其并没有改变。
测试代码如下:
void CdemoDlg::OnBnClickedButton1() { #define DIR_LEN 100 char dir1[DIR_LEN]; memset(dir1,0,DIR_LEN); GetCurrentDirectory(DIR_LEN,dir1); MessageBox(dir1,0,0); CString filePathName; CFileDialog fileDlg(true); char *filename; if (fileDlg.DoModal()==IDOK) { char dir2[DIR_LEN]; memset(dir2,0,DIR_LEN); GetCurrentDirectory(DIR_LEN,dir2); MessageBox(dir2,0,0); filePathName = fileDlg.GetPathName(); MessageBox(filePathName,0,0); filename = filePathName.GetBuffer(filePathName.GetLength()); } }
只贴了Button响应函数的代码。程序运行后界面如下:
当单击选择文件时,MessageBox输出如下:
单击确定,
单击打开时,MessageBox输出结果如下:
我们可以看到两次输出结果并没有改变。再点击确定时,输出:
这个就是我们打开的文件。
在使用CFileDialog时,我有时希望得到打开的文件的绝对路径,我们可以使用CFileDialog的成员函数GetPathName(),该函数的返回值是CString类型的,如若向转换为char字符串类型,可以使用CString的成员函数GetBuffer。
第二种方法:GetModuleFileName()函数。该函数原型如下:
DWORD GetModuleFileName( HMODULE hModule,
LPTSTR lpFilename,DWORD nSize
);
函数参数说明:
hModule : 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。
lpFileName : 是你存放返回的名字的内存块的指针,是一个输出参数
nSize : 装载到缓冲区lpFileName的最大值
函数返回值:
如果返回为成功,将在lpFileName的缓冲区当中返回相应模块的路径,如果所设的nSize过小,那么返回仅按所设置缓冲区大小返回相应字符串内容。
如果函数失败,返回值将为0,利用GetLastError可获得异常代码。
该函数包含在“Windows.h”头文件中。
将上面的代码中的GetCurrentDirectory()换为GetModuleFileName(),程序输出如下图,它输出应用程序的全路径了,包含应用程序名。
而我们在实际应用中往往只想知道它所在的目录,我们可以通过如下代码实现。
部分代码:
memset(dir1,0,DIR_LEN); GetModuleFileName(NULL,dir1,DIR_LEN); char *pDest = strrchr(dir1,'\\'); int nPos = pDest - dir1 + 1; dir1[nPos] = 0; MessageBox(dir1,0,0);
程序运行结果如下:
对于以上代码说明一点:函数strrchr(dir1,'\\')表示从右边开始找字符’\\’的位置返回找到一个该字符的地址,注意其中有一个’\’是转义用的。下一句代码nPos = pDest - dir1 + 1是两个地址相减。
本文下载地址:http://www.kuaipan.cn/file/id_63913550065725685.htm