TStreamWriter(自动)Flush不?

时间:2014-01-06 15:30:51

标签: delphi delphi-xe2

尽管在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。

  • FStreamWriter是TStreamWriter类型的表单属性。
  • 使用fmCreate or fmOpenWrite创建没有任何区别。
  • TcxEventDescription确实提供了有效的返回字符串> 500字节包含CRLF。
  • 正如您所看到的,我没有对编码做任何事情,都是默认的Unicode内容。
  • 我正在使用Delphi XE2 IDE或作为独立的可执行文件运行。
  • Win7 64bit下的32位应用

可以发生什么以及如何解决?

[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字节。

1 个答案:

答案 0 :(得分:3)

TStreamWriter刷新意味着它只会将其缓冲区写入附加的流。这并不意味着任何TFileStream都会刷新其OS缓冲区,因为TStreamWriter不知道任何TFileStream(只有TStream)。

更糟糕的是,您正在提供由您自己创建的TFileStream实例。因此,TStreamWriter不会获取流的所有权,因此不会在Destroy上释放它。然而,释放流将关闭文件,从而将内容写入磁盘。