【问题标题】:Ini files: DeleteKey leaves empty sectionIni 文件:DeleteKey 留下空白部分
【发布时间】:2011-10-24 01:09:15
【问题描述】:

当一个ini文件包含一个只有一个键的部分时(如MySection1 in

[MySection1]
MyKey1=MyValue1
[MySection2]
...

) 为该键调用 DeleteKey 会留下一个空白部分:

[MySection1]
[MySection2]
...

我希望那个空白部分也能被删除。当然我可以调用类似的东西

if not ini.SectionExists('MySection1') then
  ini.EraseSection('MySection1');

在每次调用DeleteKey 之后(或覆盖TExtIniFile.DeleteKey),但我希望有一种自动方法可以让Windows 或VCL 做到这一点。你知道吗?

更新:我正在使用一个 TIniFile 后代,它只添加了一些额外的 Read*/Write* 方法。

更新:我的测试例程:

procedure TForm1.Button1Click(Sender: TObject);
var
  ini: TMyIniFile;
begin
  ini := TMyIniFile.Create(cIniFileName);
  try
    ini.WriteString('MySection1', 'MyKey1', 'MyValue1');
    ini.DeleteKey('MySection1', 'MyKey1');
  finally
    ini.Free;
  end;

  Show;
end;

procedure TForm1.Show;
begin
  if FileExists(cIniFileName) then
    Memo1.Lines.LoadFromFile(cIniFileName)
  else
    Memo1.Lines.Clear;
end;

TMyIniFile 可以是TIniFile 的别名,也可以是TMemIniFile 的后代,其析构函数调用UpdateFile

【问题讨论】:

  • 你使用的是TIniFile还是TMemIniFile
  • 澄清一下,SectionExists 返回 false 如果部分“存在”但其中没有(即 0)键?
  • @Andreas:是的。这个名字是次优的。 :-)
  • TMemIniFile 的表现是否更好?
  • @David:不。TMemIniFile 在部分之间添加空行(看起来不错),但仍然留下空部分。

标签: delphi delphi-2007 ini


【解决方案1】:

我认为没有“让 Windows 或 VCL 做到这一点的自动方式”。我相信原因是“API”不知道您不打算再使用该部分(即,如果 API 在您删除最后一个键后删除该部分,有人会抱怨这效率低下,因为他们打算稍后将密钥添加到该部分,因此必须重新创建该部分)。此外,有人可能会争辩说,空白部分的存在也携带信息,因此在自动删除的情况下该信息将丢失。

【讨论】:

  • 我猜你是对的 - 我发现了专门询问如何添加空白部分的帖子。
  • 既然解析出来的ini文件内容无论有没有空部分都是一样的,我不同意你说的空部分确实携带信息的说法。
  • 当您使用 custon descendatn 时,只需在您的类中添加一个 DeleteKeyAndSectionIfEmpty() 方法。
  • @Smasher 但是您可以测试该部分是否存在 - SectionExists() 方法以防 TIniFile - 这是 1 位信息。
  • 已接受 - 我想我会顺应主流,忍受空缺部分的丑陋。 :-)
【解决方案2】:

我不相信TIniFileTMemIniFile 会按照您想要的方式运行。因此可能的解决方案是:

  1. 按照您的建议覆盖 DeleteKey
  2. 覆盖 UpdateFile 并在此时删除所有 empty 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多