close 再open也不行,Windows的缓存可能很大,整个文件都在缓存了(文件才97K)。读网络实时变化的文件你们可能很少试过吧:-(
to lzc(阿成仔) : 你在那家公司做?
摘抄微软《Network Programming for Windows》一段话: “Microsoft Windows offers applications the capability to communicate over a network using built-in file system services. This is sometimes referred to as the network operating system (NOS) capability. (Windows使应用程序能通过作系统内建的文件系统服务在网络上通信。有时候,我们将之称为“网络作系统”(NOS)能力。)” “This functionality allows applications to use common file system API functions, such as ReadFile and WriteFile, to access remote files across a network.(应用程序可自由使用一些常规的文件系统API函数,比如ReadFile和WriteFile 等通过网络访问远程文件)”
这是不是和 TDataBase 使用的事务级别有关?
我以前作过,你则样的程序,不过没有你这样的问题,不过我是直接,读写 .dbf的,我给你源程序,你自己分析一下吧!unit dbfinter;interface uses sysutils; type EDBFERROR=class(Exception); dbf_header=record dbf_version:char; update_year:shortint; update_month:shortint; update_day:shortint; records:longint; header_length:word; record_length:word; user_argument:longint; reserve:array [0..15] of char; end; dbf_record=record field_name:array[0..10] of char; field_type:char; field_offset:longint; field_length:shortint; field_decade:shortint; reserved_space:array [0..13] of char; end; Tdbf=class(tobject) private head:dbf_header; field:array[1..100] of dbf_record; recordbuf:array[0..1024] of char; public filename:string; handle:integer; records:longint; fields:integer; broker:boolean; position:integer; function open(s:string):integer; function cell(r,c:integer):string; function cells(r,c:integer):string; function celln(r:integer;name:string):string; function cellns(r:integer;name:string):string; procedure close; end;implementation uses windows,Dialogs,forms,spx_main,ustru;function Tdbf.open(s:string):integer; var r,i:integer; dbferr:edbferror; begin position:=-1; filename:=s; handle:=fileopen(s,fmopenread or fmsharedenynone); result:=handle; if (handle > 0) then begin broker:=false; fileseek(handle,0,0); if fileread(handle,head,32) < 32 then begin dbferr:=edbferror.Create('DBFERROR'); broker:=true; main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在'); raise dbferr; exit; end; r:=(head.header_length-32) div 32; for i:=1 to r do begin if fileread(handle,field[i],32) < 32 then begin dbferr:=edbferror.Create('DBFERROR'); broker:=true; main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在'); raise dbferr; exit; end; end; records:=head.records; fields:=r; end else begin broker:=true; main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在'); end; end;function Tdbf.cell(r,c:integer):string; var offset:longint; len:integer; s:string[255]; i:integer; dbferr:edbferror; begin if broker = true then begin open(filename); end; offset:=head.header_length + (r-1)*head.record_length; if position <> r then begin fileseek(handle,offset,0); if fileread(handle,recordbuf,head.record_length) < head.record_length then begin dbferr:=edbferror.Create('DBFERROR'); broker:=true; main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在'); raise dbferr; exit; end; position:=r; end; if (recordbuf[0] = char(0)) then begin recordbuf[0]:=char(32); end; if (c = 0) then begin offset:=0; len:=1; end else begin offset:=1; for i:=1 to c-1 do offset:=offset+field[i].field_length; len:=field[c].field_length; end; s:=copy(recordbuf,offset+1,len); if ((c <> 0) and (field[c].field_type = 'N')) then begin try if (field[c].field_decade <> 0) then begin if pos('.-',s) = 0 then begin s:=format('%.'+inttostr(field[c].field_decade)+'f',[strtofloat(trim(s))]); end else begin s:='0.00'; end; end else begin s:=inttostr(strtoint(trim(s))); end; result:=s; except result:='0'; end; end else result:=s; end;function Tdbf.cells(r,c:integer):string; var offset:longint; len:integer; s:string[255]; i:integer; dbferr:edbferror; begin if broker = true then begin open(filename); end; offset:=head.header_length + (r-1)*head.record_length; if position <> r then begin fileseek(handle,offset,0); if fileread(handle,recordbuf,head.record_length) < head.record_length then begin dbferr:=edbferror.Create('DBFERROR'); broker:=true; main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在'); raise dbferr; exit; end; position:=r; end; if (recordbuf[0] = char(0)) then begin recordbuf[0]:=char(32); end; if (c = 0) then begin offset:=0; len:=1; end else begin offset:=1; for i:=1 to c-1 do offset:=offset+field[i].field_length; len:=field[c].field_length; end; s:=copy(recordbuf,offset+1,len); result:=s; end;function Tdbf.celln(r:integer;name:string):string; var i,c:integer; begin if broker = true then begin open(filename); end; for i:=1 to fields do begin if (uppercase(field[i].field_name) = uppercase(name)) then begin c:=i; result:=cell(r,c); exit; end; end; result:=''; end;function Tdbf.cellns(r:integer;name:string):string; var i,c:integer; begin if broker = true then begin open(filename); end; for i:=1 to fields do begin if (uppercase(field[i].field_name) = uppercase(name)) then begin c:=i; result:=cells(r,c); exit; end; end; result:=''; end;procedure Tdbf.close; begin if handle > 0 then begin try fileclose(handle); except end; end; end;end.
to lzc(阿成仔) :
你在那家公司做?
“Microsoft Windows offers applications the capability to communicate over a network using built-in file system services. This is sometimes referred to as the network operating system (NOS) capability. (Windows使应用程序能通过作系统内建的文件系统服务在网络上通信。有时候,我们将之称为“网络作系统”(NOS)能力。)”
“This functionality allows applications to use common file system API functions, such as ReadFile and WriteFile, to access remote files across a network.(应用程序可自由使用一些常规的文件系统API函数,比如ReadFile和WriteFile 等通过网络访问远程文件)”
我以前作过,你则样的程序,不过没有你这样的问题,不过我是直接,读写
.dbf的,我给你源程序,你自己分析一下吧!unit dbfinter;interface
uses sysutils;
type
EDBFERROR=class(Exception);
dbf_header=record
dbf_version:char;
update_year:shortint;
update_month:shortint;
update_day:shortint;
records:longint;
header_length:word;
record_length:word;
user_argument:longint;
reserve:array [0..15] of char;
end;
dbf_record=record
field_name:array[0..10] of char;
field_type:char;
field_offset:longint;
field_length:shortint;
field_decade:shortint;
reserved_space:array [0..13] of char;
end;
Tdbf=class(tobject)
private
head:dbf_header;
field:array[1..100] of dbf_record;
recordbuf:array[0..1024] of char;
public
filename:string;
handle:integer;
records:longint;
fields:integer;
broker:boolean;
position:integer;
function open(s:string):integer;
function cell(r,c:integer):string;
function cells(r,c:integer):string;
function celln(r:integer;name:string):string;
function cellns(r:integer;name:string):string;
procedure close;
end;implementation
uses windows,Dialogs,forms,spx_main,ustru;function Tdbf.open(s:string):integer;
var r,i:integer;
dbferr:edbferror;
begin
position:=-1;
filename:=s;
handle:=fileopen(s,fmopenread or fmsharedenynone);
result:=handle;
if (handle > 0) then
begin
broker:=false;
fileseek(handle,0,0);
if fileread(handle,head,32) < 32 then
begin
dbferr:=edbferror.Create('DBFERROR');
broker:=true;
main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
raise dbferr;
exit;
end;
r:=(head.header_length-32) div 32;
for i:=1 to r do
begin
if fileread(handle,field[i],32) < 32 then
begin
dbferr:=edbferror.Create('DBFERROR');
broker:=true;
main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
raise dbferr;
exit;
end;
end;
records:=head.records;
fields:=r;
end
else
begin
broker:=true;
main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
end;
end;function Tdbf.cell(r,c:integer):string;
var
offset:longint;
len:integer;
s:string[255];
i:integer;
dbferr:edbferror;
begin
if broker = true then
begin
open(filename);
end;
offset:=head.header_length + (r-1)*head.record_length;
if position <> r then
begin
fileseek(handle,offset,0);
if fileread(handle,recordbuf,head.record_length) < head.record_length then
begin
dbferr:=edbferror.Create('DBFERROR');
broker:=true;
main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
raise dbferr;
exit;
end;
position:=r;
end;
if (recordbuf[0] = char(0)) then
begin
recordbuf[0]:=char(32);
end;
if (c = 0) then
begin
offset:=0;
len:=1;
end
else
begin
offset:=1;
for i:=1 to c-1 do
offset:=offset+field[i].field_length;
len:=field[c].field_length;
end;
s:=copy(recordbuf,offset+1,len);
if ((c <> 0) and (field[c].field_type = 'N')) then
begin
try
if (field[c].field_decade <> 0) then
begin
if pos('.-',s) = 0 then
begin
s:=format('%.'+inttostr(field[c].field_decade)+'f',[strtofloat(trim(s))]);
end
else
begin
s:='0.00';
end;
end
else
begin
s:=inttostr(strtoint(trim(s)));
end;
result:=s;
except
result:='0';
end;
end
else
result:=s;
end;function Tdbf.cells(r,c:integer):string;
var
offset:longint;
len:integer;
s:string[255];
i:integer;
dbferr:edbferror;
begin
if broker = true then
begin
open(filename);
end;
offset:=head.header_length + (r-1)*head.record_length;
if position <> r then
begin
fileseek(handle,offset,0);
if fileread(handle,recordbuf,head.record_length) < head.record_length then
begin
dbferr:=edbferror.Create('DBFERROR');
broker:=true;
main_form.logmess(LOGT_MESSAGE,0,'文件'+filename+'不存在');
raise dbferr;
exit;
end;
position:=r;
end;
if (recordbuf[0] = char(0)) then
begin
recordbuf[0]:=char(32);
end;
if (c = 0) then
begin
offset:=0;
len:=1;
end
else
begin
offset:=1;
for i:=1 to c-1 do
offset:=offset+field[i].field_length;
len:=field[c].field_length;
end;
s:=copy(recordbuf,offset+1,len);
result:=s;
end;function Tdbf.celln(r:integer;name:string):string;
var i,c:integer;
begin
if broker = true then
begin
open(filename);
end;
for i:=1 to fields do
begin
if (uppercase(field[i].field_name) = uppercase(name)) then
begin
c:=i;
result:=cell(r,c);
exit;
end;
end;
result:='';
end;function Tdbf.cellns(r:integer;name:string):string;
var i,c:integer;
begin
if broker = true then
begin
open(filename);
end;
for i:=1 to fields do
begin
if (uppercase(field[i].field_name) = uppercase(name)) then
begin
c:=i;
result:=cells(r,c);
exit;
end;
end;
result:='';
end;procedure Tdbf.close;
begin
if handle > 0 then
begin
try
fileclose(handle);
except
end;
end;
end;end.