作为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位。
答案 0 :(得分:2)
Raymond Chen an excellent article(他的大多数文章都是)讨论了这个问题。
底线是,在NTFS中,文件大小(和其他元数据)属于文件数据本身,而不是目录条目。
在某些情况下(例如文件关闭时),元数据复制到目录条目,但延迟复制可能会导致目录信息中的信息在某种程度上失效。请注意,总是至少有点过时了,因为你获得文件大小的实例,如果有人写信给它,它将会过时。
您实际上可以通过调用GetFileSize()
来绕过目录条目中的元数据,该{{1}}将转到该信息的文件。资源管理器不会这样做,主要是因为它没有真正的理由不信任文件系统,并且不信任会导致更多的I / O.
更多细节,写得比我能做得更好:-),可以在上面的链接文章中找到。