首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

VC++ 獲取當前路徑、模組完整路徑與程式檔名的完整技巧

     編輯:關於C語言

VC++ 取得路徑看似簡單,實則暗藏多處陷阱:GetCurrentDirectory 受檔案對話框影響、GetModuleFileName 需手動截取目錄、PathStripPath 行為不一致。本文系統整理三大場景最佳實務。

一、取得當前工作目錄

方法 1:GetCurrentDirectory(受 CFileDialog 影響)

char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
// 輸出: "D:\Test"

陷阱:呼叫 CFileDialog、CFile::Open 後,若未設 OFN_NOCHANGEDIR,工作目錄會切換至使用者選擇的資料夾。

對策:

  • CFileDialog dlg(..., OFN_NOCHANGEDIR | ...);
  • 或:先 GetCurrentDirectory 存檔,事後 SetCurrentDirectory 還原。

方法 2:GetModuleFileName + 截取目錄(推薦,不受對話框影響)

CString path;
GetModuleFileName(NULL, path.GetBuffer(MAX_PATH), MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
path = path.Left(pos);  // "D:\Test"

二、取得使用者選取檔案完整路徑

CFileDialog dlg(TRUE, NULL, NULL,
    OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_NOCHANGEDIR,
    _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"));
if (dlg.DoModal() == IDOK) {
    CString fullPath = dlg.GetPathName(); // 含檔名完整路徑
}

三、取得執行檔檔名

方法 1:PathStripPath(需 shlwapi.lib,行為有邊界情況)

#include 
#pragma comment(lib, "shlwapi.lib")
TCHAR szPath[] = _T("D:\\Test\\tst.exe");
PathStripPath(szPath);  // → "tst.exe"
TCHAR szDir[]  = _T("D:\\Test\\Debug");
PathStripPath(szDir);   // → "Debug"  (非檔名!)

缺點:無法辨識目錄尾斜線、根目錄會回傳 D:\,非純檔名提取。

方法 2:手動截取(最穩健)

CString fullPath;
GetModuleFileName(NULL, fullPath.GetBuffer(MAX_PATH), MAX_PATH);
fullPath.ReleaseBuffer();  // 必須呼叫,否則 GetLength()=0
int pos = fullPath.ReverseFind('\\');
CString exeName = fullPath.Right(fullPath.GetLength() - pos - 1);

總結建議

需求推薦 API關鍵點
工作目錄GetModuleFileName + 截取不受對話框干擾
模組完整路徑GetModuleFileName直接可用
使用者選檔路徑CFileDialog::GetPathName加 OFN_NOCHANGEDIR
單純檔名手動 ReverseFind('\\')避免 PathStripPath 邊界怪異
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved