2013-01-11 81 views
3

我用TiniFile來讀取一個inf文件。但在某些部分身份相同,TiniFile無法讀取它。如何讀取inf文件?

例如:

本節:

[AMD.Mfg] 
%AMD.DeviceDesc0% = AMDSMBus, PCI\VEN_1002&DEV_4353 
%AMD.DeviceDesc0% = AMDSMBus, PCI\VEN_1002&DEV_4363 
%AMD.DeviceDesc0% = AMDSMBus, PCI\VEN_1002&DEV_4372 
%AMD.DeviceDesc0% = AMDSMBus, PCI\VEN_1002&DEV_4385 
%AMD.DeviceDesc0% = AMDSMBus, PCI\VEN_1022&DEV_780B 

我的代碼:

var 
     inf : TiniFile; 
     list : TStringList; 
    begin 
     //Create 
     inf := TIniFile.Create(infPath); 
     list := TStringList.Create; 
     inf.ReadSectionValues('AMD.Mfg', list); 
     Memo1.Lines.AddStrings(list2); 
    end; 

它顯示此:

%AMD.DeviceDesc0%=AMDSMBus, PCI\VEN_1002&DEV_4353 
%AMD.DeviceDesc0%=AMDSMBus, PCI\VEN_1002&DEV_4353 
%AMD.DeviceDesc0%=AMDSMBus, PCI\VEN_1002&DEV_4353 
%AMD.DeviceDesc0%=AMDSMBus, PCI\VEN_1002&DEV_4353 
%AMD.DeviceDesc0%=AMDSMBus, PCI\VEN_1002&DEV_4353 

我猜想的一樣的ident導致此,所以我的問題當ident是相同的時候,n是如何讀取的?

回答

5

你很模糊你的意思是「讀」。其實你可以通過Delphi的任何手段閱讀該文件。我個人倒使用TStringList.LoadFromFile

的問題是,你會怎麼做閱讀後...

你也可以嘗試烏爾機會與TMemIniFile做閱讀。但我個人當然會避免任何與INI有關的方法,因爲這些文件強烈偏離了m BASIC INI的前提,並且任何INI相關的庫可能會在任何升級中改變它的實現方式,從而破壞使用它的程序。

+0

'TStringList'是最好的解決方案,自己讀取數據。 –

8

TIniFile是圍繞Windows的API的包裝要求進行讀/寫INI文件,因此,有限的什麼是Windows API的支持,專門爲GetPrivateProfileString

AFAIK有文件格式沒有正式的定義,並且,正如您剛剛發現的那樣,Microsoft實現不支持重複鍵,因爲該函數始終首次返回。

如果你看收於ReadSectionValues實現,你會發現它首先讀取段鍵,然後在一個循環中獲取鍵值,因爲這是與提到GetPrivateProfileString函數的方式,因此它是爲所有呼叫獲得相同的值。

我的建議是停止使用TIniFile讀取非INI文件的文件。

+1

TMemIniFile不是Win32 API包裝 - 但我認爲它不會在這裏工作。 –