当前位置:主页>仓库管理软件> 列表

如何取得正在写的文件大小? 找用友财务软件教程

库存管理软件版1楼: 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再重新关联、取文件大小,但这样巨大的增加了运算代价,实不可取,有没有办法?

2楼: 找了半天竟然没发现有报告当前文件指针位置的函数:(
一个最笨但相当直接的办法:累计每次写入文件的字符串长度。 :-P 如出纳记账软件

3楼: Lof();

这里的不知道了

4楼: 可以这样改
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;

5楼: 获取Delphi中文本文件TextFile的大小
http://lysoft.lz169.com/kingron/textfilesize.html

6楼: ..................
Writeln(F, ''Take me to your Heart'');
Flush(F);//加上这句
Size:= FileSize(F);
.................

库存管理软件版7楼: 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;

8楼: 整理如下:

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!

9楼: 看了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

10楼: [:D]

11楼: 受教,放分

12楼: procedure Rewrite(var F: File [; Recsize: Word ] );后面还有一个参数,如果不写,默认为写入128个字节,你改为rewrite(F,1),再试试。 如用友财务软件教程

13楼: 多人接受答案了。

库存管理软件版14楼: Deve: 文本文件不能Rewrite带参数~~~,是固定死的