如何取得正在写的文件大小?(100分)

  • 主题发起人 主题发起人 xfz8124
  • 开始时间 开始时间
X

xfz8124

Unregistered / Unconfirmed
GUEST, unregistred user!
var
F: TextFile;
FileName: string;
i: Integer;
Size: Integer;
begin
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
AssignFile(F, FileName);
Rewrite(F);
for i:= 0 to 100 do
begin
Writeln(F, 'Take me to your Heart');

//判断当前文件大小,如果大于1KB就停止写文件
Size:= FileSize(F);
if Size > 1024 then
Break;

end;
CloseFile(F);
end;

然而不幸的是,这段代码是不工作的,最后得到的文件大小是2323 Byte
如何判断一个正在写的文本文件的大小呢,当然可以先调用CloseFile再重新关联、取文件大小,但这样巨大的增加了运算代价,实不可取,有没有办法?
 
找了半天竟然没发现有报告当前文件指针位置的函数:(
一个最笨但相当直接的办法:累计每次写入文件的字符串长度。 :-P
 
Lof();

这里的不知道了
 
可以这样改
var
F: TFileStream;
FileName: string;
i: Integer;
s := string[23];
begin
s := 'Take me to your Heart'#13#10;
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
F := TFileStream.Create(FileName, fmCreate);
try
for i:= 0 to 100 do begin
F.WriteBuffer(s[1], 23);

//判断当前文件大小,如果大于1KB就停止写文件
if F.Position > 1024 then
Break;

end;
finally
F.Free;
end;
end;
 
获取Delphi中文本文件TextFile的大小
http://lysoft.lz169.com/kingron/textfilesize.html
 
..................
Writeln(F, 'Take me to your Heart');
Flush(F);//加上这句
Size:= FileSize(F);
.................
 
var
F: TextFile;
FileName, s: string;
i: Integer;
Size: Integer;
begin
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
AssignFile(F, FileName);
Rewrite(F);
size:=0;
for i:= 0 to 100 do
begin
s:='Take me to your Heart';
Writeln(F, s);
size:=size+Length(s)+2;
//判断当前文件大小,如果大于1KB就停止写文件
//Size:= FileSize(F);
if Size > 1024 then
Break;

end;
CloseFile(F);
end;
 
整理如下:

1、farsail的FileStream实现:
关键句:
F := TFileStream.Create(FileName, fmCreate);
F.WriteBuffer(s[1], Length(S));
if F.Position > 1024 then

var
F: TFileStream;
FileName: string;
i: Integer;
s : string;
begin
s := 'Take me to your Heart' + #13#10;
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
F := TFileStream.Create(FileName, fmCreate);
try
for i:= 0 to 100 do
begin
F.WriteBuffer(s[1], Length(S));

//判断当前文件大小,如果大于1KB就停止写文件
if F.Position > 1024 then
Break;

end;
finally
F.Free;
end;
end;

2、TYZhang的Flush(F)经测试是无效的

3、Kaida的缓存计算实现
这种方式对于以追加方式打开的文件,还需要一个在开始写入之前,获取一下文件大小,送Size变量,在farsail的方法,fmCreate模式改为fmAppend模式(语法不是fmAppend,另有其名,但我对流还不熟),调用F.Positon仍然是方便的

本人认为,farsail's Implemention is Better!
 
看了Kingron提供的笔记,对TextFile取文件大小给出了详细说明,录如下:

By Kingron
Delphi封装了文本文件,提供一个TextFile便于程序员可以方便地操作文本文件。但是Delphi中没有对TextFile做出详细的说明,导致一些问题的存在,例如FileSize就存在返回文件大小不正确的问题。
为了提高操作效率,TextFile被实现的时候,默认采取128字节的缓冲区,该缓冲区被当成一个记录,而Delphi的函数FileSize返回的是记录大小,因此如果你要根据文件的大小进行某些操作,那么就要注意了!例如下面的代码就不正确:

var
F: TextFile;
FileName: string;
i: Integer;
Size: Integer;
begin
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
AssignFile(F, FileName);
Rewrite(F);
for i:= 0 to 100 do
begin
Writeln(F, 'Take me to your Heart');

//判断当前文件大小,如果大于1KB就停止写文件
Size:= FileSize(F);
if Size > 1024 then
Break;
end;

CloseFile(F);
end;

本来应该是1KB左右的文件,结果变成2KB了~,正确的写法应该是:
var
F: TextFile;
FileName: string;
i: Integer;
Size: Integer;
begin
FileName:= ExtractFilePath(ParamStr(0)) + 'Log.txt';
AssignFile(F, FileName);
Rewrite(F);
for i:= 0 to 100 do
begin
Writeln(F, 'Take me to your Heart');

//判断当前文件大小,如果大于1KB就停止写文件
Size:= FileSize(F) * TTextRec(F).BufSize;
if Size > 1024 then
Break;

end;
CloseFile(F);
end;

Kingron's Implementionis As Better as farsail's
 
受教,放分
 
procedure Rewrite(var F: File [
Recsize: Word ] );后面还有一个参数,如果不写,默认为写入128个字节,你改为rewrite(F,1),再试试。
 
多人接受答案了。
 
Deve: 文本文件不能Rewrite带参数~~~,是固定死的
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部