VC获取当前路径及程序名的实现代码
一、获取当前运行目录的绝对路径
1、使用GetCurrentDirectory函数
假设程序路径为D:\Test\tst.exe,执行GetCurrentDirectory函数
charpBuf[MAX_PATH]; GetCurrentDirectory(MAX_PATH,pBuf);
pBuf="D:\Test"
但是如果使用CFileDialog、CFile::Open等函数后,设置不当则会导致再次获取当前路径值改变。所以,如要避免当前路径改变,如果使用CFileDialog,则要把在CFileDialog的dwFlags标志设置为OFN_NOCHANGEDIR。如下:
CFileDialoghFileDlg(false,NULL, NULL, OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR, TEXT("TextFiles(*.txt)|*.txt|AllFiles(*.*)|*.*|"), NULL);
也可以,先执行GetCurrentDirectory把获取到目录路径保存下来,处理完成后,再次SetCurrentDirectory设置一下。
2、使用GetModuleFileName
CStringstrCurPath; GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH); intpos=strCurPath.ReverseFind(_T('\\')); strCurPath=strCurPath.Left(pos);
输出(路径包括运行文件名):
strCurPath="D:\Test\tst.exe"
二、获取打开文件的完整路径
通过对话框打开文件时,一般均需获取打开文件的完整路径,可使用CFileDialog的GetPathName函数,代码如下:
CFileDialoghFileDlg(false,NULL, NULL, OFN_FILEMUSTEXIST|OFN_READONLY|OFN_PATHMUSTEXIST|OFN_NOCHANGEDIR, TEXT("TextFiles(*.txt)|*.txt|AllFiles(*.*)|*.*|"), NULL); if(hFileDlg.DoModal()==IDOK){ m_strEdtSrcFile=hFileDlg.GetPathName(); UpdateData(FALSE); }
三、获取当前运行程序名
通过GetModuleFileName获取完整路径后,可以使用PathStripPathAPI函数解析路径,代码示例如下:
/* #include"shlwapi.h" #pragmacomment(lib,"shlwapi.lib") */ TCHARszPath2[]=TEXT("D:\\Test\\tst.exe"); PathStripPath(szPath2); //Result:szPath2==tst.exe TCHARszPath3[]=TEXT("D:\\Test\\Debug"); PathStripPath(szPath3); //Result:szPath3==Debug TCHARszPath4[]=TEXT("D:\\Test\\Debug\\"); PathStripPath(szPath4); //Result:szPath4==Debug\ TCHARszPath5[]=TEXT("D:\\"); PathStripPath(szPath5); //Result:szPath5==D:\
使用此函数要注意,并非只是提取文件名,如果它不能识别时,则会返回原始字符串(不做处理)。所以,不放心的话,自己手动提取文件名更为保险。
CStringstrCurPath; GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH) strCurPath.ReleaseBuffer();//MustReleaseBuffer,orGetLength=0 intpos=strCurPath.ReverseFind(_T('\\')); intlen=strCurPath.GetLength(); strCurPath=strCurPath.Right(len-pos-1);
参考资料:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773756%28v=vs.85%29.aspx
CString诡异的GetLength()返回0
如果CString是从GetPrivateProfileStr()返回的
记得return该CString前释放buffer
要不,CString.GetLength()将返回0
找了半天原因,
----------------------------------------------------
“IfyouusethepointerreturnedbyGetBuffertochangethestringcontents,youmustcallReleaseBufferbeforeusinganyotherCStringmemberfunctions.”
在i=m_SZFileName.GetLength()之前调用m_SZFileName.ReleaseBuffer()就可以了。
临时搞两天VC,在VC里如何获取当前程序的名字和路径以及如何分割字符串
#include"stdafx.h" #include<windows.h> intmain(intargc,char*argv[]) { //先获取运行程序的完整路径 charszFileName[256]; memset(szFileName,'"0',sizeof(szFileName)); GetModuleFileName(NULL,szFileName,sizeof(szFileName)); //再分割完整路径的字符串,最后一个就是程序的名字 charseps[]="\\"; char*token=NULL; charexeName[256]; memset(exeName,'\0',sizeof(exeName)); token=strtok(szFileName,seps); while(token!=NULL) { sprintf(exeName,"%s",token); token=strtok(NULL,seps); } printf("%s\n",exeName); getchar(); return0; }