3

我曾经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

我猜是同一个 ident 造成的,所以我的问题是当 ident 相同时如何阅读它?

4

2 回答 2

8

TIniFile 是围绕 Windows API 调用读取/写入 INI 文件的包装器,因此受限于 Windows API 支持的内容,特别是GetPrivateProfileString

AFAIK 没有文件格式的正式定义,而且,正如您刚刚发现的,Microsoft 实现不支持重复键,因为该函数总是返回第一次出现。

如果您仔细查看 ReadSectionValues 实现,您会注意到它首先读取部分键,然后在循环中检索键值,因为这是使用提到的 GetPrivateProfileString 函数的方式,因此它得到的所有值相同电话。

我的建议是停止使用 TINiFile 来读取不是 INI 文件的文件

于 2013-01-11T08:46:35.613 回答
5

您对“阅读”的含义非常模糊。实际上,您可以通过 Delphi 拥有的多种方式读取该文件。我个人会使用TStringList.LoadFromFile

问题是你读完之后会怎么做……

你也可以试试你的机会TMemIniFile来做这件事。但我个人肯定会避免使用任何与 INI 相关的方法,因为这些文件严重偏离 mbasic INI 前提,并且任何与 INI 相关的库都可能在任何升级时更改其实现,从而破坏使用它的程序。

于 2013-01-11T09:08:01.867 回答