参数的定义跟上面的Write相同。注意:当写入的数据字节数与需要写入的字节
数不相同时,将产生EWriteError异常。
3、CopyFrom:此方法的作用是从其它流中拷贝数据流。函数原形为:
Function CopyFrom(Source:TStream;Count:Longint):Longint;
参数Source为提供数据的流,Count为拷贝的数据字节数。当Count大于0时,
CopyFrom从Source参数的当前位置拷贝Count个字节的数据;当Count等于0时,
CopyFrom设置Source参数的Position属性为0,然后拷贝Source的所有数据;
TStream还有其它派生类,其中最常用的是TFileStream类。使用TFileStream
类来存取文件,首先要建立一个实例。声明如下:
constructor Create(const Filename:string;Mode:Word);
Filename为文件名(包括路径),参数Mode为打开文件的方式,它包括文件的打
开模式和共享模式,其可能的取值和意义如下:
打开模式:
fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它。
fmOpenRead :以只读方式打开指定文件
fmOpenWrite :以只写方式打开指定文件
fmOpenReadWrite:以写写方式打开指定文件
共享模式:
fmShareCompat :共享模式与FCBs兼容
fmShareExclusive:不允许别的
程序以任何方式打开该文件
fmShareDenyWrite:不允许别的
程序以写方式打开该文件
fmShareDenyRead :不允许别的
程序以读方式打开该文件
fmShareDenyNone :别的
程序可以以任何方式打开该文件
TStream还有一个派生类TMemoryStream,实际应用中用的次数也非
常频繁。它叫内存流,就是说在内存中建立一个流对象。它的基本方法和函数跟
上面是一样的。
好了,有了上面的基础后,我们就可以开始我们的编程之行了。
-----------------------------------------------------------------------
二、实际应用之一:利用流制作EXE文件加密器、捆绑、自解压文件及安装
程序 我们先来说一下如何制作一个EXE文件加密器吧。
EXE文件加密器的原理:建立两个文件,一个用来添加资源到另外一个EXE文件
里面,称为添加程序。另外一个被添加的EXE文件称为头文件。该
程序的功能是
把添加到自己里面的文件读出来。
Windows下的EXE文件结构比较复杂,有的
程序还有校验和,当发现自己被改变
后会认为自己被病毒感染而拒绝执行。所以我们把文件添加到自己的
程序里面,
这样就不会改变原来的文件结构了。我们先写一个添加函数,该函数的功能是把
一个文件当作一个流添加到另外一个文件的尾部。函数如下:
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;
有了上面的基础,我们应该很容易看得懂这个函数。其中参数SourceFile是
要添加的文件,参数TargetFile是被添加到的目标文件。比如说把a.exe添加到
b.exe里面可以:Cjt_AddtoFile(''a.exe'',b.exe'');如果添加成功就返回True否则
返回假。
&