INI檔案簡介
在我們寫程式時,總有一些配置資訊需要儲存下來,以便在下一次啟動程式完成初始化,這實際上是一種類持久化。将一些資訊寫入INI檔案(initialization file)中,可完成簡單的持久化支援。
Windows提供了API接口用于操作INI檔案,其支援的INI檔案格式一般如下:
===============================
[Section1]
Key11=value11
Key12=value12
[Section2]
Key21=value21
Key22=value22
...
[SectionN]
KeyN1=valueN1
KeyN2=valueN2
一般一個INI檔案可有N個節,每節可有n個鍵名及值對應,每個鍵名及其值以等式形式占一行。
一般鍵的名稱可任取,不過建議用有意義的字元及詞構成。值一般可為整數和字元串,其它類型要進行轉換。
常見的系統配置檔案:
C:/boot.ini
C:/WINDOWS/win.ini
C:/WINDOWS/system.ini
C:/WINDOWS/desktop.ini
C:/WINDOWS/Resources/Themes/Windows Classic.theme
注意,字元串存貯在INI檔案中時沒有引号;key和value之間的等号前後不容空格;注釋以分号“;”開頭。
VC中操作INI檔案的API
(1)作業系統配置檔案Win.ini的函數:
函數名 | 功能 |
GetProfileSection | 讀取win.ini中指定節lpAppName中所有鍵名及其值。lpReturnedString字元串形式如下: Key1=Value1/0Key2=Value2/0…KeyN=ValueN/0/0 |
GetProfileString | 讀取win.ini中指定節lpAppName中鍵名為lpKeyName對應變量的字元串值。 |
GetProfileInt | 讀取win.ini中指定節lpAppName中鍵名為lpKeyName對應變量的整數值。 |
WriteProfileSection | 寫(替換)win.ini中指定節lpAppName中的鍵值。 lpString字元串形式同GetProfileSection中的lpReturnedString。 |
WriteProfileString | 寫(替換)win.ini中指定節lpAppName中鍵名為lpKeyName對應變量的字元串值。 |
(2)操作使用者自定義配置檔案(PrivateProfile.ini)的函數:
GetPrivateProfileSectionNames | 讀取lpFileName指定的配置檔案中所有的節名。lpszReturnBuffer字元串形式如下: Section1/0Section2/0…SectionN/0/0 |
GetPrivateProfileSection | 同GetProfileSection。 |
GetPrivateProfileString | 同GetProfileString。 |
GetPrivateProfileInt | 同GetProfileInt |
GetPrivateProfileStruct | 須同WritePrivateProfileStruct配套使用。 |
WritePrivateProfileSection | 同WriteProfileSection |
WritePrivateProfileString | 同WriteProfileString |
WritePrivateProfileStruct | 不常用。 |
注意:
(1)使用得最頻繁的是 GetPrivateProfileString 和 WritePrivateProfileString,沒有WriteProfileInt/WritePrivateProfileInt函數。
(2)Get系列讀取節鍵值,如果檔案路徑有誤或節鍵名不對則傳回設定的預設值。
(3)訪存自定義配置檔案時,檔案路徑lpFileName必須完整,檔案名前面的各級目錄必須存在。如果lpFileName檔案路徑不存在,則函數傳回FALSE,GetLastError() = ERROR_PATH_NOT_FOUND。如果路徑正确,但是檔案不存在,則該函數将先建立該檔案。如果路徑及檔案存在,則在現有ini檔案基礎上進行讀寫。
如果 lpFileName 隻指定檔案名而沒有路徑的話,調用API将會去 Windows 的安裝目錄去查找而不會在目前目錄查找。
(4)要對調用API的子產品(exe)所在目錄下進行配置檔案操作,可使用形如“.//config.ini”的相對路徑,注意轉義符。
(5)調用WritePrivateProfileSection,若參數三 lpString為NULL,則可将對應section的全部内容清空;調用WritePrivateProfileString,若參數三 lpString為NULL,則可将對應key删除。
跨平台配置檔案
INI檔案本質是對檔案和字元串的處理,是以在跨平台項目中的配置檔案可以基于<stdio.h>中的标C檔案FILE,然後實作像類似以上對節([Section])、鍵(Key)和值(Value)的字元串讀寫功能。
鑒于XML的樹形描述層次結構性清晰,現在很多軟體都大面積使用XML檔案進行配置,如QQ的全局配置檔案C:/Program Files/Tencent/QQ/gf-config.xml。java程式的配置檔案基本都使用XML格式,C++中并沒有操作XML檔案的标準庫。
在C/C++程式中要使用XML做為配置檔案,涉及到XML的解析。Windows平台可使用MsXml對XML進行解析,參考《MsXml建立和解析XML示例》,跨平台可以考慮自己實作,或使用C++ BOOST正規表達式,或選擇Free C or C++ XML Parser Libraries,如XmlParser、TinyXML、CMarkup、libxml等。
CIniFile類
以下提供對Windows操作INI檔案的API的簡單封裝類CIniFile。