gpt4 book ai didi

delphi - TStreamWriter (Auto)Flush 不行吗?

转载 作者:行者123 更新时间:2023-12-01 20:17:33 31 4
gpt4 key购买 nike

尽管 Text File Writing performances in Delphi 中有所说(肯·怀特的回答下的评论),我看到 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 或 fmOpenWrite 创建没有区别。
  • TcxEventDescription 确实给出了包含 CRLF 的有效返回字符串 > 500 个字节。
  • 如您所见,我没有对编码进行任何操作,所有默认的 Unicode 内容。
  • 我从 Delphi XE2 IDE 运行或作为独立可执行文件运行。
  • Win7 64位下的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 字节。

最佳答案

TStreamWriter 刷新意味着它只会将其缓冲区写入附加流。这并不一定意味着任何 TFileStream 将刷新其操作系统缓冲区,只是因为 TStreamWriter 不知道任何 TFileStream(仅 TStream)。

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

关于delphi - TStreamWriter (Auto)Flush 不行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953302/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com