function Cjt_AddtoFile(SourceFile, TargetFile: string): Boolean;
var
  Target, Source: TFileStream;
  MyFileSize: integer;
begin
  try
    Source := TFileStream.Create(SourceFile, fmOpenRead or fmShareExclusive);//创建实例
    Target := TFileStream.Create(TargetFile, fmOpenWrite or fmShareExclusive);
    try
      Target.Seek(0, soFromEnd); // 往尾部添加资源
      Target.CopyFrom(Source, 0);
      MyFileSize := Source.Size + sizeof(MyFileSize); //计算资源大小,并写入辅程尾部
      Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
    finally
      Target.Free;
      Source.Free;
    end;
  except
    Result := False;
    Exit;
  end;
  Result := True;
end;
1)
Target.Seek(0, soFromEnd); 
这里的seek是指定指针位置吗  如果是Target.Seek(-1, soFromEnd); 那么是不是文件的尾往前一个位置
2)
Target.CopyFrom(Source, 0);
这里的拷贝函数第2个参数为0时,设置source的position为0才拷贝source所有数据,但这个函数里没有设置position为0
是不是默认为0呢
3)
这里的MyFileSize := Source.Size + sizeof(MyFileSize); 为什么要加上sizeof(MyFileSize)
4)
Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
这里的参数缓冲区为什么可以是一个integer类型的呀 我对缓冲区不懂哦 到底是啥  应该什么类型希望老大们帮我解答其中的问题,谢谢了~~

解决方案 »

  1.   

    1)Target.Seek(0, soFromEnd); 指定指针位置,Target.Seek(-1, soFromEnd)是文件的尾往前一个位置
    2)Source := TFileStream.Create...
      Source的初始位置就为0
    3)procedure WriteBuffer(const Buffer; Count: Longint);
     buff可以是任何类型的变量.
      

  2.   

    漏一个个3)
    MyFileSize := Source.Size + sizeof(MyFileSize); 
    这是你程序中文件格式要求的,最终的文件长度是源文件的长加上一个整形的长度:
    Target.WriteBuffer(MyFilesize, SizeOf(MyFileSize));
    比源文件多写了一个integer
      

  3.   

    1.Seek:此方法实现流中读取指针的移动。函数原形为:   
      Function   Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;   
      参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:   
      soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。   
      soFromCurrent:Offset为移动后指针与当前指针的相对位置。   
      soFromEnd:Offset为移动后指针距离数据结束的位置。此时Offset必须小于或者等于零。该方法返回值为移动后指针的位置。   2.此方法的作用是从其它流中拷贝数据流。函数原形为:   
      Function   CopyFrom(Source:TStream;Count:Longint):Longint;   
      参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据;   3.因为你这里要在流的尾部添加1个integer类型数值(当前流的大小)4.WriteBuffer:此方法的作用是在当前位置向流写入数据,把你上面计算的当前流的大小写入流的尾部。