分享

VC获取当前路径及程序名

 oskycar 2012-09-29

VC上或取当前路径有多种方法,最常用的是使用 GetCurrentDirectory和GetModuleFileName函数,个中都有诸多注意事项,特别总结一下。

一、获取当前运行目录的绝对路径
1、使用GetCurrentDirectory函数

假设程序路径为D:\Test\tst.exe,执行GetCurrentDirectory函数

 
char pBuf[MAX_PATH]; 

GetCurrentDirectory(MAX_PATH,pBuf);
pBuf="D:\Test"

但是如果使用CFileDialog、CFile::Open等函数后,设置不当则会导致再次获取当前路径值改变。所以,如要避免当前路径改变,如果使用CFileDialog,则要把在CFileDialog的dwFlags标志设置为OFN_NOCHANGEDIR。如下:

 
CFileDialog hFileDlg(false,NULL , 

         NULL, 

         OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR, 

         TEXT("Text Files (*.txt)|*.txt|All Files(*.*)|*.*|"), 

         NULL);
也可以,先执行GetCurrentDirectory把获取到目录路径保存下来,处理完成后,再次SetCurrentDirectory设置一下。

2、使用GetModuleFileName

 
 CString strCurPath; 

 GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH); 

 int pos= strCurPath.ReverseFind(_T('\\')); 

     strCurPath = strCurPath.Left(pos);
输出(路径包括运行文件名):

strCurPath="D:\Test\tst.exe"

二、获取打开文件的完整路径
通过对话框打开文件时,一般均需获取打开文件的完整路径,可使用CFileDialog的GetPathName函数,代码如下:

 
 CFileDialog hFileDlg(false,NULL , 

     NULL, 

     OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR, 

     TEXT("Text Files (*.txt)|*.txt|All Files(*.*)|*.*|"), 

     NULL); 

 if(hFileDlg.DoModal() == IDOK) { 

     m_strEdtSrcFile = hFileDlg.GetPathName(); 

     UpdateData(FALSE); 

 }
三、获取当前运行程序名
通过GetModuleFileName获取完整路径后,可以使用PathStripPath API函数解析路径,代码示例如下:


 
/* 

 #include "shlwapi.h" 

 #pragma comment(lib, "shlwapi.lib ") 

 */

   

 TCHAR szPath2[] = TEXT("D:\\Test\\tst.exe"); 

 PathStripPath(szPath2); 

 // Result: szPath2 ==tst.exe 

       

 TCHAR szPath3[] = TEXT("D:\\Test\\Debug"); 

 PathStripPath(szPath3); 

 // Result: szPath3 == Debug 

   

 TCHAR szPath4[] = TEXT("D:\\Test\\Debug\\"); 

 PathStripPath(szPath4); 

 // Result: szPath4 == Debug\ 

   

 TCHAR szPath5[] = TEXT("D:\\"); 

 PathStripPath(szPath5); 

 // Result: szPath5 == D:\
使用此函数要注意,并非只是提取文件名,如果它不能识别时,则会返回原始字符串(不做处理)。所以,不放心的话,自己手动提取文件名更为保险。

 
 CString strCurPath; 

 GetModuleFileName(NULL,strCurPath.GetBuffer(MAX_PATH),MAX_PATH) 

 strCurPath.ReleaseBuffer();//Must ReleaseBuffer, or GetLength=0 

 int pos= strCurPath.ReverseFind(_T('\\')); 

 int len = strCurPath.GetLength(); 

 strCurPath =  strCurPath.Right(len-pos-1);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多