我看了一段将一个文件加在另一个文件的结尾的例子:
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));
////
谢谢!!!
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));
////
谢谢!!!
什么意思?现在有文件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的大小,然后存成文件,接着你应该明白了吧!
你告诉我,你如何区分哪部分是A哪部分是B
你看这句话!在这句话以前C的大小=Size(A)+Size(B);可是,他又Write进去了SizeOf(MyFileSize)个字节这里SizeOf(MyFileSize)其实就相当于SizeOf(integer)
MyFileSize是integer类型的。所以.........
文件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
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F你把这个C还原成A和B2个文件,你怎么做?
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的
哎~~~,跟你讲真累!希望你懂了