我看了一段将一个文件加在另一个文件的结尾的例子:
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;
////
        Target.CopyFrom(Source,0);这句已经将一个文件加在另一个文件的结尾;
        那么以下这两句是什么作用?
        MyFileSize:=Source.Size + Sizeof(MyFileSize);
        Target.WriteBuffer(MyFileSize,Sizeof(MyFileSize));
////
谢谢!!!

解决方案 »

  1.   

    “那么这个附加文件的大小我在合并后的文件结尾看不出来吗?”
    什么意思?现在有文件A 文件B合并后是文件C, C=A+B+[B的大小]
    C的长度=Size(A)+Size(B)+SizeOf([B的大小])解开的时候,先读[B的大小],C从开头读[Size(C) - B的大小]个字节
    [你注意我说他的B的大小,并不是真的B的大小,他还包括记录该值的大小]
    所以[Size(C) - B的大小]是A的大小,然后存成文件,接着你应该明白了吧!
      

  2.   

    如果不加那两句话,合并后你怎么知道C中属于A的数据是哪些??
    你告诉我,你如何区分哪部分是A哪部分是B
      

  3.   

    C的长度=Size(A)+Size(B)+SizeOf([B的大小])C的长度为什么还要加SizeOf([B的大小]),我这点搞不明白,请指教!!!谢谢!!!
      

  4.   

    Target.WriteBuffer(MyFileSize,Sizeof(MyFileSize));
    你看这句话!在这句话以前C的大小=Size(A)+Size(B);可是,他又Write进去了SizeOf(MyFileSize)个字节这里SizeOf(MyFileSize)其实就相当于SizeOf(integer)
    MyFileSize是integer类型的。所以.........
      

  5.   

    你的代码执行结果如下:如果文件A内容为:(大小为16bytes)00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
    文件B的内容为:(大小为16bytes)20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 合并后的C为:(大小为:16+16+4=36Bytes)00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
    14 00 00 00注意最后的14 00 00 00的这4个bytes,实际是一个Integer类型
    因为计算机器是先取高字节作为低进行运算(如果你这个不懂就
    应该去看看相关的基础书籍)所以实际值是$00000014 也就是10进制的
    20,为什么是20呢,就是B的大小16+存储这个值所用空间4=20
      

  6.   

    那为什么要加SizeOf(integer),大小不就是size(A) + size(B)吗?谢谢!!!
      

  7.   

    ........00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F你把这个C还原成A和B2个文件,你怎么做?
      

  8.   

    如果你说还原成
    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

    20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F我告诉你,你错了。我可以用A:
    00 01 02 03 04 05 06 07
    和文件B:
    08 09 0A 0B 0C 0D 0E 0F
    20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
    和成文件C所以C文件里必须加入一些辅助信息。也就是上面提到的东西
    这样才能区别C文件里哪一部分是文件A的,哪一部分是B的
    哎~~~,跟你讲真累!希望你懂了