VC++獲取當前路徑及程序名的實現代碼


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);

參考資料:

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 
找了半天原因, 
---------------------------------------------------- 
“If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions. ” 

在i=m_SZFileName.GetLength()之前調用m_SZFileName.ReleaseBuffer()就可以了。

臨時搞兩天VC,在VC里如何獲取當前程序的名字和路徑以及如何分割字符串

#include "stdafx.h"
#include <windows.h> 
 

int main(int argc, char* argv[])

{
 //先獲取運行程序的完整路徑
 char szFileName[256];
 memset(szFileName,'"0',sizeof(szFileName));

 GetModuleFileName(NULL,szFileName, sizeof(szFileName)); 

 //再分割完整路徑的字符串,最后一個就是程序的名字 
 char seps[] = "\\" ; 
 char *token = NULL; 
 
 char exeName[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();
  return 0;
}

其它參考鏈接:C語言字符串操作總結大全(超詳細)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM