INI文件(Initialization file ,又稱(chēng)為初始化文件)是用來(lái)保存應用程序設置和選項的一種特殊的ASCII文件,以“.ini”作為文件擴展名,也被稱(chēng)做配置文件或概要文件(Profile)。除了各個(gè)應用程序可以擁有自己私有的初始化文件外,Windows系統還提供有一個(gè)系統的初始化文件Win.ini,并由此對當前的Windows系統進(jìn)行配置,同時(shí)也可以在其內記錄系統內其他應用程序在運行時(shí)的選項。
通常為應用程序所私有的初始化文件比較小,這樣可以減少程序在初始化時(shí)所讀取的信息量,從而提高程序的啟動(dòng)速度。而系統初始化文件Win.ini由于除了記錄有關(guān)系統的大量信息外,還存儲著(zhù)許多其他應用軟件的初始化數據,因此其通常比較龐大,訪(fǎng)問(wèn)的數據量要遠比私有的配置文件大得多。如沒(méi)有必要,一般不建議對Win.ini文件進(jìn)行操作,但如果待存取的信息涉及到Windows系統環(huán)境或是其他應用程序時(shí), 就必須對Win.ini進(jìn)行讀寫(xiě)訪(fǎng)問(wèn),并在訪(fǎng)問(wèn)的同時(shí)發(fā)送WM_WININICHANGE消息給所有的頂層窗口,通知其他進(jìn)程系統初始化文件已被更改。
配置文件里的信息之所以能為系統和眾多不同類(lèi)型的應用程序讀取并識別,是由于其內部對數據的存取采用了預先約定的“項-值對(Entry-value pairs)”存儲結構, 并對待存取的數據分門(mén)別類(lèi)地進(jìn)行存儲。下面是系統目錄下Win.ini文件的部分內容:
[windows]
load=
run=
NullPort=None
[Desktop]
WallpaperStyle=2
Pattern=(無(wú))
在此,配置文件將信息分為若干“節”,節標題放在方括號中,如“[Desktop]”就是Desktop節,在每一個(gè)節中包含了一些與之相關(guān)的“項”,并通過(guò)等號對其進(jìn)行賦值。一般形式如下:
[SECTION]
ENTRY=VALUE
在初始化文件中,VALUE值只能有兩種數據類(lèi)型:數值和字符串。Windows分別為這兩種數據類(lèi)型提供了兩套API函數對初始化文件進(jìn)行數據讀取,在寫(xiě)入初始化文件時(shí)則只支持對字符串的寫(xiě)入,數值等類(lèi)型必須先進(jìn)行數據類(lèi)型的轉換,然后才能寫(xiě)入到初始化文件。私有初始化文件的訪(fǎng)問(wèn) 對私有初始化文件的數據存取是由GetPrivateProfileInt()、GetPrivateProfileString()和WritePrivateProfileString()等三個(gè)API函數來(lái)完成的。其函數說(shuō)明如下:
UINT GetPrivateProfileInt(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
INT nDefault, // 在項名沒(méi)有找到時(shí)返回的缺省值
LPCTSTR lpFileName // 初始化文件名地址
);
DWORD GetPrivateProfileString(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
LPCTSTR lpDefault, // 缺省字符串
LPTSTR lpReturnedString, // 存放字符串的緩沖區地址
DWORD nSize, // 緩沖區大小
LPCTSTR lpFileName // 初始化文件名地址
);
BOOL WritePrivateProfileString(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
LPCTSTR lpString, // 要寫(xiě)入的字符串地址
LPCTSTR lpFileName // 初始化文件名地址
);
其中,GetPrivateProfileInt()返回的是初始化文件lpFileName中lpAppName節內lpKeyName項的整數值,如果沒(méi)有找到該項則返回缺省值nDefault。如果此項目存在,但值不為整數,則返回0。如果某項目的值中含有非數字字符則只返回第一個(gè)非數字前的字符,例如對于“Value = 21century”則只返回數值21。初始化文件名lpFileName可以是全路徑也可以只是文件名,如果不指定具體路徑,Windows系統將在系統目錄對文件進(jìn)行尋找。GetPrivateProfileString()和WritePrivateProfileString()的用法基本與之類(lèi)似,只是處理對象的數據類(lèi)型不同。
私有初始化文件主要用來(lái)保存同應用程序當前狀態(tài)相關(guān)的一些信息,當程序退出后,這些信息由于已寫(xiě)入到初始化文件而得以保留,當程序再次運行時(shí),可以通過(guò)對此初始化文件各項數據的讀取而得知此應用程序在上次運行期間的相關(guān)信息。下面這段代碼即通過(guò)對私有初始化文件的訪(fǎng)問(wèn)而對程序的運行次數和上一次的運行日期進(jìn)行記錄:
CString sPath,sMsg,sTime,sDate;
char buffer[255];
// 獲取當前應用程序全路徑
GetModuleFileName(NULL, buffer, MAX_PATH);
sPath = CString(buffer);
sPath = sPath.Left(sPath.ReverseFind('\\'));
// 得到初始化文件的全路徑
sPath += "\\Sample04.ini";
// 得到程序累計運行次數
UINT Time = GetPrivateProfileInt("PROGRAM", "RUNTIME", 0, sPath);
// 得到上次運行日期
GetPrivateProfileString("DATE", "LAST", "2002-11-1", buffer, 1000, sPath);
// 顯示從初始化文件獲取到的文件信息
sMsg.Format("本軟件共運行過(guò)%d次,上次運行日期為%s", Time, CString(buffer));
AfxMessageBox(sMsg);
// 累加運行次數,并保存到初始化文件
Time++;
sTime.Format("%d", Time);
WritePrivateProfileString("PROGRAM", "RUNTIME", sTime, sPath);
// 獲取當前日期,并保存到初始化文件
CTime tm = CTime::GetCurrentTime();
sDate.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay());
WritePrivateProfileString("DATE", "LAST", sDate, sPath);
在程序執行后,初始化文件Sample04.ini的內容為:
[DATE]
LAST =2002-11-12
[PROGRAM]
RUNTIME =1
系統目錄下的Win.ini是一種特殊的初始化文件,主要為系統提供初始化服務(wù),在系統啟動(dòng)時(shí)將被系統所訪(fǎng)問(wèn),并根據其所保存的參數值對系統進(jìn)行配置。Windows專(zhuān)門(mén)提供了三個(gè)API函數GetProfileInt()、GetProfileString()和WriteProfileString()對Win.ini進(jìn)行讀寫(xiě)訪(fǎng)問(wèn),其函數用法同訪(fǎng)問(wèn)私有初始化文件的那幾個(gè)函數非常類(lèi)似,只是不必再去指定初始化文件名。下面是這三個(gè)函數的原型聲明:
UINT GetProfileInt(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
INT nDefault // 在項名沒(méi)有找到時(shí)返回的缺省值
);
DWORD GetProfileString(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
LPCTSTR lpDefault, // 缺省字符串地址
LPTSTR lpReturnedString, // 存放字符串的緩存的地址
DWORD nSize // 緩存的大小
);
BOOL WriteProfileString(LPCTSTR lpAppName, // 節名地址
LPCTSTR lpKeyName, // 項名地址
LPCTSTR lpString // 要寫(xiě)入字符串的地址
);
只要對前面對私有初始化文件進(jìn)行訪(fǎng)問(wèn)的代碼稍加改動(dòng)即可將程序的配置信息添加到Win.ini中,改動(dòng)后的代碼如下:
CString sPath,sMsg,sTime,sDate;
// 得到程序累計運行次數
UINT Time = GetProfileInt("PROGRAM", "RUNTIME", 0);
// 得到上次運行日期
GetProfileString("DATE", "LAST", "2002-11-1", buffer, 1000);
// 顯示從初始化文件獲取到的文件信息
sMsg.Format("本軟件共運行過(guò)%d次,上次運行日期為%s", Time, CString(buffer));
AfxMessageBox(sMsg);
// 累加運行次數,并保存到初始化文件
Time++;
sTime.Format("%d", Time);
WriteProfileString("PROGRAM", "RUNTIME", sTime);
// 獲取當前日期,并保存到初始化文件
CTime tm = CTime::GetCurrentTime();
sDate.Format("%d-%d-%d", tm.GetYear(), tm.GetMonth(), tm.GetDay());
WriteProfileString("DATE", "LAST", sDate);
由于Win.ini文件是系統初始化文件,在程序沒(méi)有運行前文件內不含“DATE”和“PROGRAM”等自定義的節以及其下各項,因此在程序第一次執行后,將由WriteProfileString()函數向Win.ini文件末尾創(chuàng )建相關(guān)節、項,并完成數據的寫(xiě)入。
(#)
聯(lián)系客服