如何读取inf文件?

时间:2013-01-11 08:33:47

标签: delphi ini inf

我使用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

我猜同样的身份会导致这种情况,所以我的问题是当身份相同时如何读取它?

2 个答案:

答案 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相关的库都可能在任何使用它的程序升级时改变其实现。