当ini文件包含只包含一个键的部分时(例如
中的MySection1
)
[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
。
答案 0 :(得分:4)
我不认为有“自动方式使Windows或VCL这样做”。我认为原因是“API”不知道您不打算再使用该部分(即,如果API删除最后一个密钥后会删除该部分,有人会抱怨这样做效率低,因为他们打算这样做稍后向该部分添加密钥,因此必须重新创建该部分。此外,有人可能会争辩说,空部分的存在也会传递信息,因此在自动删除的情况下信息会丢失。
答案 1 :(得分:1)
我不相信TIniFile
或TMemIniFile
会以您想要的方式运作。因此,可能的解决方案是:
DeleteKey
。UpdateFile
并删除所有空部分。