要把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'单独成最后行? 

解决方案 »

  1.   

    可以,我刚测试过了没问题
    楼主可以用ultraedit看下,写过后的文件
      

  2.   

    sql档本身是文本,用textfile不更好??
      

  3.   

    ssall,ss:Tstringlist;ssall.loadfromfile(a.sql);
    //[可以循环
    ss.loadfromfile(b.sql);
    ssall.addstrings(ss);
    //]
    ssall.savetofile(a.sql)
      

  4.   

    找到原因了,b.sql结尾最后是回车换行符,换成换行符,应该可以的。但b.sql是mysqldump程序自动生成;有其他方法吗?用过append 循环readln writeln实现,但可以先全部读取,再追加吗?可以实现。有没有补充的?不然结贴了。
      

  5.   

    问题应该在这里:
    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; 
      

  6.   

    更正一下代码:(前面的有点儿想当然了,嘿嘿)
    fs:=Inttostr(r.Size+Sizeof(fs));//计算资源大小,并写入尾部
    f.WriteBuffer(fs[1],Length(fs));