1.先通过函数GetModuleFileName获取执行程序的绝对路径。
TCHAR szPath[ MAX_PATH ] = {0};
GetModuleFileName( NULL, szPath, MAX_PATH );
其中GetModuleFileName函数为windows的API函数,使用的时候需要包含windows.h的头文件;MAX_PATH是一个宏定义,值为260。执行完GetModuleFileName函数之后,szPath数组中保存的就是执行程序当前的绝对路径。
假设执行程序xp.exe的绝对路径为C:\Program Files\Dll\xp.exe,那么szPath数组中存储的值就是C:\Program Files\Dll\xp.exe。
2.根据执行程序的绝对路径得到需要访问的文件的绝对路径。
这里需要用到_tcsrchr函数来将获取到的执行程序的绝对路径中的执行程序的名称去掉。即将上面路径C:\Program Files\Dll\xp.exe中的xp.exe去掉,只得到C:\Program Files\Dll\。方法如下:
(_tcsrchr(szPath,_T('\\')))[1] = 0;
注:_tcsrchr包含在头文件tchar.h中。
3.将要访问的文件的名称添加到已经得到的路径中。
假设需要访问的文件是1.txt,那么如下:
CString strPath = szPath;
strPath = strPath + "1.txt";
在非MFC中,CString包含在atlstr.h头文件中,在MFC中包含在cstring.h的头文件中。
程序整体如下:
TCHAR szPath[ MAX_PATH ] = {0};
if ( GetModuleFileName( NULL, szPath,MAX_PATH ) )
{
(_tcsrchr(szPath,_T('\\')))[1] = 0;
}
CString strPath = szPath;
strPath = strPath + _T("1.txt");
或者
CString Result, sPath;
Result = _T("");
TCHAR sFileName[256];
GetModuleFileName(AfxGetInstanceHandle(), sFileName, 255); // 取得当前可执行文件的路径,保存在sFileName中
sPath = sFileName;
int index = sPath.ReverseFind('\\'); // 逆向查找指定字符
sPath = sPath.Left(index);
Result = sPath + _T("\\1.txt");
FROM: http://blog.sina.com.cn/s/blog_780976a001015k1q.html
【说明】关于_tcsrchr一行代码
_tcsrchr
查找字符串中某个字符最后一次出现的位置 两个参数 第一个参数:字符串 第二个参数:查找的字符 返回值:指向最后一次在字符串中出现的该字符的指针,如果要查找的字符再串中没有出现,则返回NULL。 |
今天看代码,突然看到了一句让我犯蒙的,一时间还没反应过来。
代码是这样写的: *_tcsrchr( szPath, _T( '\\' ) ) = 0;
仔细推敲了一下,这句代码其实可以分解为两句。 _tcsrchr( szPath, _T( '\\' ) )查找szPath中最后一个\所在的位置,并返回\以后的字符串。
*是取值操作,返回指针所指向地址的值,赋为0也就是将后面的字符串截断.
还有一种写法,效果是一样的(_tcsrchr(szPath, _T('\\')))[1] = 0;
from:http://blog.csdn.net/zuiyuezhou888/article/details/7852472