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