File 老式的文本文件I/O不刷新
作为后续行动,我尝试进行快速而肮脏的老式文本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
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;-)