要把B.sql的文本内容追加到A.sql尾部
本来用append,但要一行行读取,源文件,再一行行追加到目标文件,好像效率不太好;打算全部读取后再全部追加.
var r,f:TFileStream;
fs:integer;
begin
while IsFileInUse('B.sql') do
begin
Sleep(500);
end; f:=TFileStream.Create('A.sql',fmOpenWrite);
r:=TFileStream.Create('B.sql',fmOpenRead);
f.Seek(0,soFromEnd);//往尾部添加资源
f.CopyFrom(r,0);
fs:=r.Size+Sizeof(fs);//计算资源大小,并写入尾部
f.WriteBuffer(fs,sizeof(fs)); f.Free;
r.Free;
end;
function IsFileInUse(fName: string): boolean;
var
HFileRes: HFILE;
begin
Result := false;
if not FileExists(fName) then //如果文件不存在
begin
result:=true;
exit;
end;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,
0 {this is the trick!}, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;这段代码有没有问题,,发现A.sql的尾部总是有'\j'单独成最后行?
本来用append,但要一行行读取,源文件,再一行行追加到目标文件,好像效率不太好;打算全部读取后再全部追加.
var r,f:TFileStream;
fs:integer;
begin
while IsFileInUse('B.sql') do
begin
Sleep(500);
end; f:=TFileStream.Create('A.sql',fmOpenWrite);
r:=TFileStream.Create('B.sql',fmOpenRead);
f.Seek(0,soFromEnd);//往尾部添加资源
f.CopyFrom(r,0);
fs:=r.Size+Sizeof(fs);//计算资源大小,并写入尾部
f.WriteBuffer(fs,sizeof(fs)); f.Free;
r.Free;
end;
function IsFileInUse(fName: string): boolean;
var
HFileRes: HFILE;
begin
Result := false;
if not FileExists(fName) then //如果文件不存在
begin
result:=true;
exit;
end;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,
0 {this is the trick!}, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;这段代码有没有问题,,发现A.sql的尾部总是有'\j'单独成最后行?
楼主可以用ultraedit看下,写过后的文件
//[可以循环
ss.loadfromfile(b.sql);
ssall.addstrings(ss);
//]
ssall.savetofile(a.sql)
fs:=r.Size+Sizeof(fs);//计算资源大小,并写入尾部
f.WriteBuffer(fs,sizeof(fs));
你把B.SQL文件添加到A.SQL之后,还添加了Fs的值,值是你是直接写的二进制,而不是ASCII值,而看你的文件类型为SQL,一般情况下应该是普通文本文件,你所看到的'\j'其实是十六进制5C与6A,也就是说你的fs值应该是6A5C,换为十进制就是27228,表示你的B.SQL大小为27228字节。如果你想在添加文件完成后将新添加的数据量写到文件里,应该添加ASCII数据,而不是直接写十六进制数据,即你的上述代码应该改为:
var r,f:TFileStream;
fs:String;
begin
while IsFileInUse('B.sql') do
begin
Sleep(500);
end; f:=TFileStream.Create('A.sql',fmOpenWrite);
r:=TFileStream.Create('B.sql',fmOpenRead);
f.Seek(0,soFromEnd);//往尾部添加资源
f.CopyFrom(r,0);
//*****
fs:=Inttostr(r.Size+Sizeof(fs));//计算资源大小,并写入尾部
f.WriteBuffer(fs,sizeof(fs));
****// f.Free;
r.Free;
end;
fs:=Inttostr(r.Size+Sizeof(fs));//计算资源大小,并写入尾部
f.WriteBuffer(fs[1],Length(fs));