File 老式的文本文件I/O不刷新

File 老式的文本文件I/O不刷新,file,delphi,file-io,delphi-xe2,File,Delphi,File Io,Delphi Xe2,作为后续行动,我尝试进行快速而肮脏的老式文本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(lTex

作为后续行动,我尝试进行快速而肮脏的老式文本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;
尽管有
Flush()
,但文件在
Closefile()
之前仍保留0字节

原因是什么,如何修复

我试着玩Windows,但在确定要用作参数的文件句柄时被卡住了

可能相关:(没有回答)

Delphi XE2,Windows-7 64位。

Raymond Chen(他的大部分文章)都在讨论这个不同的问题

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

在某些情况下(例如文件关闭时),元数据会复制到目录项,但延迟复制可能会导致目录信息中的信息在某种程度上过时。请注意,它总是至少有一点过时,因为当您获得文件大小的实例时,如果有人向它写入内容,它就会过时

实际上,您可以通过调用
GetFileSize()
绕过目录项中的元数据,这将转到该文件以获取该信息。Explorer不这样做,主要是因为它没有真正的理由不信任文件系统,而且这种不信任会导致更多的I/O


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

谢谢。是的,我担心是文件系统,因为即使是这种老式的DOS风格的文件I/O也有“问题”。好吧,回到OutputDebugString;-)