不幸的是,这个问题可能有点模糊,我有一个难以描述的问题,它是断断续续的,我自己无法重现它,我只是希望其他人以前见过类似的东西。
我的应用程序有很多文本和 ini 文件,它们在关闭时会被写入。通常这将响应关闭事件,但也可能由 WM_ENDSESSION 触发。不幸的是,目前我不确定这些事件中的一个或两个是否会导致我将要描述的问题,因为我自己无法重现这个问题。
我遇到的问题是,对于某些用户来说,一些文本和 ini 文件最终被写为 NULL。文件大小最终看起来是正确的,但不是文本,而是每个字符都写为 x00。因此,我最终得到了 500 个 x00,而不是 500 个字节的常规 ASCII 文本。我还有一个应用程序日志文件,有时也会写入空值。但是,将 x00 记录到日志文件不一定与将 x00 写入配置文件的时间完全相同。
对于我的文件,我使用的是 TmemIniFile 或 TstringList,这意味着最终会为我的所有配置文件调用 Tstrings.SaveToFile。
sl:=TstringList.Create;
try
SourceList.GetSpecificSubset(sl);
AppLogLogLine('Commands: Saving Always Available list. List has '+inttostr(sl.Count)+' commands.');
sl.SaveToFile(fn);
finally
sl.Free;
end;
但是我也有一个实例,我已经在内存中有一个 TstringList ,我只是在它上面调用 SaveToFile 。对于 TmemIniFile,结构看起来与上面类似。在某些情况下,我可能有一个外部循环来编写多个列表。其中一些将导致文件被正确写入,一些将充满 00。
编辑:GetSpecificSubset 只是一个用命令名称列表填充“sl”的函数。我有“GetAllUsersCommands”、“GetHiddenCommands”、“GetAlwaysVisibleCommands”等。请注意,我的日志文件也写了这种东西,以检查这些列表有多大:
2013 年 16 月 10 日上午 11:17:49:命令:保存任何用户列表。列表有 8 个命令。2013 年 16 月 10 日上午 11:17:49:命令:保存始终可见列表。列表有 17 个命令。2013 年 16 月 10 日上午 11:17:49:命令:保存始终隐藏列表。列表有 2 个命令。
我不小心将日志行从上面的代码中删除了。所以这个日志行是调用 Tstrings.SaveToFile 之前写的最后一件事,此时它认为它有数据。即使不知何故每一行文本都是 NULL,我仍然希望在文件中看到 x13x10,但这并没有发生。
这是十六进制编辑器的屏幕截图:
编辑2:我刚刚意识到我遗漏了一条非常重要的信息。这只是间歇性的。它在 99% 的时间内都有效。在关机时保存文件时,它甚至可能不是所有文件。即使我有一个保存多个类似文件的循环,有些可能工作正常,有些可能会失败。