尽管在Text File Writing performances in Delphi(Ken White的回答中的评论)中有所说,我看到TStreamWriter 不使用以下代码进行刷新:
procedure TFrmAddEvents.LogEvent(AEvent: TcxSchedulerEvent);
begin
if not Assigned(FStreamWriter) then
begin
FStreamWriter := TStreamWriter.Create(TFileStream.Create(ChangeFileExt(ParamStr(0),'.log'),fmCreate or fmOpenRead));
FStreamWriter.AutoFlush := true;
end;
FStreamWriter.WriteLine(TcxEventDescription(AEvent));
// Even this has no effect:
FStreamWriter.Flush;
end;
即使在执行
之后if Assigned(FStreamWriter) then FStreamWriter.Free;
在FormClose中,文件仍为0字节 程序执行完毕后,文件为600+ kB。
fmCreate or fmOpenWrite
创建没有任何区别。可以发生什么以及如何解决?
[2014年1月7日编辑]
Uwe回答后更新了代码;仍然不起作用:
procedure TFrmAddEvents.LogEvent(AEvent: TcxSchedulerEvent);
var lName: string;
begin
lName := ChangeFileExt(ParamStr(0),'.log');
if not Assigned(FStreamWriter) then
begin
FStreamWriter := TStreamWriter.Create(lName); // Or TStreamWriter.Create(lName,true);
FStreamWriter.AutoFlush := true;
end;
FStreamWriter.WriteLine(TcxEventDescription(AEvent));
// Next does not help either:
FStreamWriter.Flush;
end;
在我调用FStreamWriter.Free之前,文件仍为0字节。
答案 0 :(得分:3)
TStreamWriter刷新意味着它只会将其缓冲区写入附加的流。这并不意味着任何TFileStream都会刷新其OS缓冲区,因为TStreamWriter不知道任何TFileStream(只有TStream)。
更糟糕的是,您正在提供由您自己创建的TFileStream实例。因此,TStreamWriter不会获取流的所有权,因此不会在Destroy上释放它。然而,释放流将关闭文件,从而将内容写入磁盘。