我使用TiniFile
来读取inf文件。但在某些部分中,同一身份相同,TiniFile
无法读取。
例如:
本节:
[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
我猜同样的身份会导致这种情况,所以我的问题是当身份相同时如何读取它?
答案 0 :(得分:8)
TIniFile是Windows API调用读取/写入INI文件的包装器,因此受限于Windows API支持的内容,特别是GetPrivateProfileString
AFAIK没有正式的文件格式定义,正如您刚才发现的那样,Microsoft实现不支持重复键,因为该函数始终返回第一次出现。
如果仔细观察ReadSectionValues实现,你会发现它首先读取了section键,然后在循环中检索键值,因为是的方法,带有上面提到的GetPrivateProfileString函数,因此它为所有呼叫获得相同的值。
我的建议是停止使用TIniFile读取不是INI文件的文件。
答案 1 :(得分:5)
你对“读”的意思很模糊。实际上你可以通过Delphi的任何手段阅读该文件。就个人而言,我使用TStringList.LoadFromFile
问题是你读完后会做什么......
您也可以尝试使用TMemIniFile
来做这件事。但我个人当然避免使用任何与INI相关的方法,因为这些文件与mbasic INI前提有很大的偏差,任何与INI相关的库都可能在任何使用它的程序升级时改变其实现。