MFC中通常需要讀取配置文件中的數據,這樣在程序中就需要獲取系統的當前目錄。獲取系統當前目錄的代碼網上很多,但是有各種限制(主要是不同的編譯器的編碼格式不同),在VS2005以及以上的版本編譯不過,需要進行各種繁瑣的字符串轉換,關於字符串的轉換問題後續再做總結。現總結了一種非常簡單的實現方法,獲取當前項目到DeBug目錄下的路徑(注:上述獲取當前的工作目錄在VS2005以及以上版本已驗證有效)。

代碼示例如下:

TCHARszPath[MAX_PATH]; 
GetModuleFileName(NULL, szPath, MAX_PATH);
CStringPathName(szPath);
//獲取exe目錄
CStringPROGRAM_PATH1 = PathName.Left(PathName.ReverseFind(_T('\\')) + 1);

執行到這一步,調試結果

PROGRAM_PATH1=D:\a\b\c\Debug\
 
CString PROGRAM_PATH2= PathName.Left(PathName.ReverseFind(_T('Debug')) );

執行到這一步,調試結果

PROGRAM_PATH2=D:\a\b\c\
 
PROGRAM_PATH2+=_T("MineSweeping\\Data\\Record.ini");

執行到這一步,調試結果

PROGRAM_PATH2=D:\a\b\c\MineSweeping\Data\Record.ini

注:這裏的a,b,c是標識用的,重點是後面的字符串的經過拼接後的變化。

 

可以根據上面調試的結果信息自由選擇Data文件夾的目錄,存放在DeBug目錄的下一級,也可以存放在與DeBug目錄同級,根據自己情況選擇。

另外,有一點需要注意的是,在用字符串表示目錄時,如_T("MineSweeping\\Data\\Record.ini")要用\\ 其中前一個’\’是轉義字符,不能只寫 ‘\’ ,否則後果就是 D:\a\b\c\MineSweepingDataRecord.ini,這樣是找不到Record.ini的,裏面的數據也就無法讀取。

這裏再説一點,在MFC程序發佈時,配置文件需要存放在Debug目錄下,至於詳細原因後續將會這對MFC程序發佈問題在做總結。

 

在編程時還發現,針對獲取當前路徑MFC已經提供了一個函數:GetCurrentDirectory 這個函數VC聲明如下:

DWORDGetCurrentDirectory(
// sizeof directory buffer
 // directory buffer
);

函數功能

獲取當前進程的當前目錄。

注意:當前目錄這東西有點怪異,本來確實是可執行文件的所在目錄,但是當用文件對話框成功打開一個文件後,該目錄就被修改為被打開的文件所在目錄。比如在程序中使用"123.txt"這樣的文件名,希望將它存儲在exe文件所在目錄中,但是當用户用文件對話框打開一個文件"F:\456.txt"後,這個123.txt會被存儲到F盤下。(VC2005下的情況,其他VC版本待驗證)在VC2008中,特地調試一下,在構造函數正調用一個加載配置文件中數據的函數OnLoadConfig(),在這個函數中添加代碼:

TCHARszPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,szPath);//獲取當前目錄
CStringPathName(szPath);

調試程序後,發現szPath是當前運行的程序Debug的上一級級目錄,因此在獲取DeBug目錄時,可以添加如下代碼:

CStringPROGRAM_PATH =
szPath;
PROGRAM_PATH+=_T("\\Debug\\Data\\Record.ini");

這樣PROGRAM_PATH即為本地Record在本地的絕對路徑。這裏只需要注意路徑路徑變換的方法,再經過斷點調

試,這兩種方法都可以避免繁瑣的字符串轉換而獲取路徑。

參數説明

nBufferLength 緩衝區的長度

lpBuffer 指定一個預定義字串,用於裝載當前目錄

返回值

調用成功 返回裝載到lpBuffer的字節數。

使用GetLastError函數可獲得錯誤信息。