关于流文件的简单问题 在线等待解答 (100分)

  • 主题发起人 主题发起人 远洋
  • 开始时间 开始时间

远洋

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟为菜鸟级人物 谁能给出下列代码的祥解?
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;


Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;
var
Source:TFileStream;
Target:TMemoryStream;
MyFileSize:integer;
begin

try
Target:=TMemoryStream.Create;
Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);
try
Source.Seek(-sizeof(MyFileSize),soFromEnd);
Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小
Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置
Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源
Target.SaveToFile(TargetFile);//存放到文件
finally
Target.Free;
Source.Free;
end;

except
Result:=false;
Exit;
end;

Result:=true;
end;


MyFileSize与sizeof(MyFileSize)有何不同
Source.Seek(-sizeof(MyFileSize),soFromEnd)这句代码如何解释?
 
sizeof(MyFileSize) 是变量 MyFileSize 的大小,即整数(integer)的大小。
MyFileSize:=Source.Size+Sizeof(MyFileSize);
是说 MyFileSize 的值等于源文件大小加上一个整数的大小。
程序的意图是把资源文件加到文件的尾部,为了读取资源文件时知道从文件的何处读起,读多少,在文件的最后再写入一个整数,该整数就是 MyFileSize。参考下图:
............ ->文件原来大小
............********* ->在尾部添加资源文件,*********代表资源文件
............*********# ->在尾部添加一个整数,#代表整数
|->读取资源文件从这里开始,即从尾部向前资源文件大小+一个整数大小开始。也就是尾部整数代表的偏移量。
 
您的解释棒极了!
小弟的delphi是下载的
刚刚过期不能用了
真是 命途多舛呀!

 
肯请您再把读出时的指针移动给以祥解
 
谢谢您的回答 现在我已经彻底明白了!
100分全给您!
[:)]
 
小弟还很无知
恳请您多多关照
 
你可能刚刚到大幅翁不久,还不知道如何给分。
注意看你的帖子最下面,点选:
O接受答案,并为 [...] 加上 100 点积分
 
不好意思!失误失误!
您能否再给讲讲
read与readbuffer有何区别?
 
分先给您 您想讲就给讲讲
不讲也thank you all the same
 
TStream.ReadBuffer(var Buffer;
Count: Longint)
Reads bytes from the stream into Buffer
//读整个Buffer
TStream.ReadBuffer(var Buffer;
Count: Longint): Longint;
Reads up to Count bytes of data from the resource associated with the handle stream into Buffer.
//读Count个字节
 
Read: 用于从流中读取字节数不确定的情况,它试图读取 Count 个字节到 Buffer,如果实际读取的字节数小于 Count 也可以,实际读取的字节数在返回值中给出。
ReadBuffer:用于从流中读取字节数为已知且固定的情况,它实际上在内部也是调用 read。如果实际读取的字节数不等于 Count,会产生 EReadError 异常。
 

Similar threads

I
回复
0
查看
686
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部