Delphi向TIniFile写入重复条目

4

这里有一个值得注意的现象。我的 Delphi 10.3 应用程序开始向 TIniFile 中写入重复条目。

以下是代码:

with TIniFile.Create(UserDatFileName) do
try
  WriteInteger(SFormName, 'Top', AForm.Top);
  WriteInteger(SFormName, 'Left', AForm.Left);
  WriteInteger(SFormName, 'Height', AForm.Height);
  WriteInteger(SFormName, 'Width', AForm.Width);
  WriteString(SFormName, 'WindowState', SWindowState);
finally
  Free;
end;

这已经运作了好几年。现在突然间,我得到了像这样的输出:

[fMainForm]
Top=0
Left=0
Height=556
Width=671
WindowState=wsMaximized
pnlNavigation.Width=165
TreeListcxTreeListModule.Width=161
Top=0
Left=0
Height=556
Width=671
WindowState=wsMaximized
pnlNavigation.Width=165
TreeListcxTreeListModule.Width=161
Top=0
Left=0
Height=556
Width=671
WindowState=wsMaximized
pnlNavigation.Width=165
TreeListcxTreeListModule.Width=161
... etcetera etcetera

你有什么建议,为什么会发生这种情况?我以为TIniFile的键值对在每个区段内应该是唯一的。


2
你能提供一个 [mcve] 吗?因为很可能是环境问题。 - David Heffernan
3
顺便说一句,我现在会使用TMemIniFile。在任何非Windows平台上都是默认选项,在Windows上也表现良好。它甚至比之前的方法快不少。你可以一次性刷新所有更改,而不必在每次写入时调用这个相对较慢的API。 - GolezTrol
5
我的猜测是文件格式问题。使用十六进制编辑器查看文件,可能会发现其中有某些字符破坏了PrivateProfileString函数的功能。 - dummzeuch
1
你尝试删除文件并查看问题是否仍然存在了吗? - R. Hoek
@r-hoek:我没有尝试过那个,确实。毫无疑问它会起作用。但我也不一定能发现问题。 - sdaberle
显示剩余3条评论
1个回答

1
@dummzeuch 赢了:文件开头有三个多余字符(十六进制 EF BB BF)。删除这些字符后问题得到解决。我还在另一个类似有问题的 INI 文件的开头找到了同样的三个字符。

1
那是字节顺序标记(BOM)。它定义了接下来的文本编码为UTF-8 - LU RD
这意味着 ini 文件由您的程序或其他程序以 UTF-8 格式存储。如果您使用 TMemIniFile,您可以将文件读取或编写为 UTF-8。请参见如何读取 UTF8 编码的 INI 文件?。但首先要弄清楚为什么最初要以 UTF-8 格式进行编写。 - LU RD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接