【问题标题】:SubSection support in .INI files.INI 文件中的子节支持
【发布时间】:2014-01-29 12:13:20
【问题描述】:

Delphi 的 RTL 有一个诱人的功能:TCustomIniFile.ReadSubSections

但这似乎并没有在任何地方得到正确解释。

  • 如何编写小节?
  • 小节实际上是如何出现在 INI 文件中的?
  • 而且,一旦您调用了ReadSubSections,您如何使用结果来读取特定小节的数据?

【问题讨论】:

  • 我认为它只在TMemIniFile docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/…中实现,所以你可以尝试使用它,然后在记事本中读取ini文件以检查格式。但由于它是 TMemIniFile-only 和非标准的,我会避免使用它。如果您确实需要使用超过两层的存储结构 - 只需使用 JSON SuperObject
  • @Arioch'除了在该页面中编写小节之外,我没有看到任何内容?我是不是错过了什么……
  • 好吧,不仅如此。它也在注册表中实现。这可能就是它的来源。 docwiki.embarcadero.com/Libraries/XE2/en/… 所以您可以尝试从 TRegistryIniFile 读取到临时字符串列表,然后从 SL 读取到 TMEmIniFile,然后将其保存到 ini 文件并在记事本中读取。我认为目的是在 Read*** 和 Write*** 方法中使用 SubSections 名称而不是 Sections 名称。我盲目地猜测它们会用反斜杠编写,就像 regedit 的带有 *.reg 扩展名的 ini 文件一样。但你确实尝试
  • 再次,我认为通过一些信誉良好的库使用标准 JSON 更有意义,而不是对 ini 文件使用非标准的非文档扩展(dbExpress 不是)
  • 对于 INI 和 JSON,唯一可靠的方法是持久化 cmets 以包含它们,因为某些键的名称具有特殊约定。或者只使用只读访问。 Windows (TIniFile) 和 Delphi (TMemInifile) 实现都不提供关于非数据的保证,并且如果他们愿意,可能会覆盖文件(并且 TMemIniFile 确实会这样做)。因此,如果您需要 cmets 要么坚持使用 XML,要么制定专门的注释值

标签: delphi ini


【解决方案1】:

要编写小节,只需将您的小节名称和小节名称用反斜杠连接起来。

[节名\子节名]

procedure Foo;
var
  LIniFile: TIniFile;
  slValues: TStringList;
  IniFileName: string;
begin
  IniFileName := ''; //your ini file
  LIniFile := TIniFile.Create(IniFileName);
  try
    //SECTION = MAINSECTION
    //SUBSECTIONS = SUBSECTION_A
    //            = SUBSECTION_B
    LIniFile.WriteString('MAINSECTION\SUBSECTION_A','IDENT','A');
    LIniFile.WriteString('MAINSECTION\SUBSECTION_B','IDENT','B');

    slValues := TStringList.Create;
    try
      LIniFile.ReadSubSections('MAINSECTION', slValues);
      //slValues.count = 2
      //slValues.strings[0] = SUBSECTION_A
      //slValues.strings[1] = SUBSECTION_B
      // do your stuff here!
    finally
      slValues.Free;
    end;
  finally
    LIniFile.Free;
  end;
end;

ini 文件如下所示:

[MAINSECTION\SUBSECTION_A]
IDENT=A
[MAINSECTION\SUBSECTION_B]
IDENT=B

【讨论】:

  • 默认的部分名称分隔符是反斜杠。
  • @UweRaabe 是的!我猜到了! TMemIniFile 尝试与 TRegIniFile 合作模仿 RegEdit.exe .reg 文件:-D
  • @UweRaabe。我已经看到了-但是发布的代码可以正常工作。 非常奇怪。
  • 实际上比这更糟糕,至少在 D2010 中。如果你在上面的例子中使用ReadSubSections('MAIN', slValues)你得到'ECTION.SUBSECTION_A''ECTION.SUBSECTION_B',所以分隔符基本上被忽略了!!!
  • @Roddy,是的 - 这个功能根本没有完全实现。无论如何我都不建议使用它。
猜你喜欢
  • 2019-08-15
  • 2013-02-17
  • 2012-10-09
  • 1970-01-01
  • 2014-11-26
  • 2015-02-17
  • 2021-05-14
  • 2014-11-22
  • 2016-12-16
相关资源
最近更新 更多