2011-07-04 48 views
1

我用tstringlist做了一个非常简单的日志。我将它写入文件:德尔福Tstringlist,写文件同步

pLog.SaveToFile(FileName); 

某处存在一个错误,并且我的计算机已关闭。 之后,我无法找到我的日志文件。可能文件以asych模式保存。 在执行之前,有一种等待写入的方法吗?

感谢, 阿尔贝托

+1

如果有一个错误,这是最有可能在自己的代码。是否分配了“pLog”?你可以通过(F7)'并按照'classes.pas'中的代码? –

回答

9

如果的SaveToFile呼叫在程序结束,程序异常终止,则此调用可能不会执行。我使用日志记录机制,它为每个日志调用打开日志文件,写入日志文本和时间,刷新然后关闭日志文件。这样,即使程序异常终止,日志文本也会保证写入文件。

下面的代码:

procedure TMainForm.Log (const s: string); 
var 
f: textfile; 

begin 
assignfile (f, logfilename); 
{$I-} // yes, I know: modern programming style requires a try/except block 
append (f); 
if ioresult <> 0 then rewrite (f); 
{$I+} 
writeln (f, datetostr (now), ' ', timetostr (now), ' ', s); 
flush (f); 
closefile (f); 
end; 
+1

+1好打电话。这从我的回答中为选项1的出现提供了一个非常合理的理由。 –

+0

当然,我不赞成旧式Pascal I/O,但这是另一回事! –

+0

这是一个我认为更好的案例。即使堆已损坏,这仍然会继续工作,而某些需要您分配文件流或从堆中使用文件流对象的操作会导致此日志记录代码本身失败,当堆内存损坏时,这实际上很烦人。 –

3

同步运行。

问题的最明显的原因是:

  1. 你是不是叫。
  2. 文件名无效(可能路径不存在)。
  3. 文件名位于您的用户没有写入权限的文件夹中(例如程序文件文件夹)。
+0

我调用savetofile重写所有的tstringlist。它可以正常工作,但是当计算机异常关机时,我发现一个长度为零的文件(并且我确信我会在喊声之前写几次) – Alberto

+0

'TStringList.SaveToFile'同步运行。这没有争议。 –