旧式TextFile I / O不会刷新

时间:2014-01-08 08:29:39

标签: file delphi file-io delphi-xe2

作为TStreamWriter (Auto)Flush does not?的后续行动,我试图做一些快速而肮脏的老式文本I / O:

procedure TFrmFlushTest.BtnTestClick(Sender: TObject);
var
  lName: String;
  i: integer;
  s: string;
  lTextFile: TextFile;
begin
  lName := ChangeFileExt(ParamStr(0),'.log');
  AssignFile(lTextFile,lName);
  ReWrite(lTextFile);
  for i := 1 to 100 do
  begin
     s := 'Let''s make this a real long string ' + IntToStr(i) + ' - ';
     s := DupeString(s,200);
     WriteLn(lTextFile,s);
     Flush(lTextFile);
  end;
  ShowMessage('Now closing');
  CloseFile(lTextFile);
end;

Closefile()之外,文件仍为Flush()的0字节。

是什么原因,如何解决?

我尝试使用Windows FlushFileBuffers,但在那里确定要用作参数的文件句柄。

也许相关:Suspicious IO behavior: System.out does not flush(没有回答)

Delphi XE2,Windows-7 64位。

1 个答案:

答案 0 :(得分:2)

Raymond Chen an excellent article(他的大多数文章都是)讨论了这个问题。

底线是,在NTFS中,文件大小(和其他元数据)属于文件数据本身,而不是目录条目。

在某些情况下(例如文件关闭时),元数据复制到目录条目,但延迟复制可能会导致目录信息中的信息在某种程度上失效。请注意,总是至少有点过时了,因为你获得文件大小的实例,如果有人写信给它,它将会过时。

您实际上可以通过调用GetFileSize()来绕过目录条目中的元数据,该{{1}}将转到该信息的文件。资源管理器不会这样做,主要是因为它没有真正的理由不信任文件系统,并且不信任会导致更多的I / O.

更多细节,写得比我能做得更好:-),可以在上面的链接文章中找到。