关于流,俺糊涂了(50分)

  • 主题发起人 主题发起人 mckz
  • 开始时间 开始时间
M

mckz

Unregistered / Unconfirmed
GUEST, unregistred user!
现在又一个文件,俺想分成三份,a,b,c 另外又一个文件d<br>俺想生成新文件e= a+d+c;<br>由于定义了很多变量,俺有些糊涂了,呵呵,那位能给出代码!<br>俺送他好东西。
 
将你的文件用流打开:<br>[red]<br>var <br>files:tfilestream;<br>files1:tmemorystream;<br>int1,int2,int3:integer;//定义三个量分割文件A;<br>begin<br>files:=tfilestream.create('你的A文件名称',fmopenreadwrite);<br>files1:=tmemorystream.create;<br>files.seek(0,0);//可要可不要,系统自动定位于开始部分<br>files1.copyfrom(files,int1);//a部分加入<br>files.free;<br>files:=tfilestream.create('你的D文件名称',fmopenreadwrite);<br>fiels1.seek(0,2);//内存流定位于末尾<br>files1.copyfrom(files,files.size);//添加了D,现在内存流是A+D了<br>files.free;<br>files:=tfilestream.create('你的A文件名称',fmopenreadwrite);<br>files.seek(-c,2)//定位到c部分的开始部分,由尾部算起<br>files1.copyfrom(files,int3);//现在是A+D+C<br>files.free;<br>files:=tfilestream.create('你的合并后的文件名称',fmcreate or fmopenreadwrite);<br>files.copyfrom(files1,files1.size);<br>files1.free;<br>files.free;<br>end;<br>[/red]<br>你自己再看看吧,很简单!<br><br>
 
部。函数如下:<br>Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;<br>var<br>Target,Source:TFileStream;<br>MyFileSize:integer;<br>begin<br>try<br>Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive);<br>Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive);<br>try<br>Target.Seek(0,soFromEnd);//往尾部添加资源<br>Target.CopyFrom(Source,0);<br>MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部<br>Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));<br>finally<br>Target.Free;<br>Source.Free;<br>end;<br>except<br>Result:=False;<br>Exit;<br>end;<br>Result:=True;<br>end;<br>有了上面的基础,我们应该很容易看得懂这个函数。其中参数SourceFile是要添加的文件,参数TargetFile是被添加到的目标文件。比如说把a.exe添加到b.exe里面可以:Cjt_AddtoFile('a.exe',b.exe');如果添加成功就返回True否则返回假。<br>根据上面的函数我们可以写出相反的读出函数:<br>Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Boolean;<br>var<br>Source:TFileStream;<br>Target:TMemoryStream;<br>MyFileSize:integer;<br>begin<br>try<br>Target:=TMemoryStream.Create;<br>Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareDenyNone);<br>try<br>Source.Seek(-sizeof(MyFileSize),soFromEnd);<br>Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小<br>Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置<br>Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源<br>Target.SaveToFile(TargetFile);//存放到文件<br>finally<br>Target.Free;<br>Source.Free;<br>end;<br>except<br>Result:=false;<br>Exit;<br>end;<br>Result:=true;<br>end;<br>其中参数SourceFile是已经添加了文件的文件名称,参数TargetFile是取出文件后保存的目标文件名。比如说Cjt_LoadFromFile('b.exe','a.txt');在b.exe中取出文件保存为a.txt。如果取出成功就返回True否则返回假。<br>打开Delphi,新建一个工程,在窗口上放上一个Edit控件Edit1和两个Button:Button1和Button2。Button的Caption属性分别设置为"确定"和"取消"。在Button1的Click事件中写代码:<br>var S:string;<br>begin<br>S:=ChangeFileExt(Application.ExeName,'.Cjt');<br>if Edit1.Text='790617' then <br>begin<br>Cjt_LoadFromFile(Application.ExeName,S);<br>{取出文件保存在当前路径下并命名"原文件.Cjt"}<br>Winexec(pchar(S),SW_Show);{运行"原文件.Cjt"}<br>Application.Terminate;{退出程序}<br>end<br>else <br>Application.MessageBox('密码不对,请重新输入!','密码错误',MB_ICONERROR+MB_OK);<br>编译这个程序,并把EXE文件改名为head.exe。新建一个文本文件head.rc,内容为: head exefile head.exe,然后把它们拷贝到Delphi的BIN目录下,执行Dos命令Brcc32.exe head.rc,将产生一个head.res的文件,这个文件就是我们要的资源文件,先留着。<br>我们的头文件已经建立了,下面我们来建立添加程序。<br>新建一个工程,放上以下控件:一个Edit,一个Opendialog,两个Button1的Caption属性分别设置为"选择文件"和"加密"。在源程序中添加一句:{$R head.res}并把head.res文件拷贝到程序当前目录下。这样一来就把刚才的head.exe跟程序一起编译了。<br>在Button1的Cilck事件里面写下代码:<br>if OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName;<br>在Button2的Cilck事件里面写下代码:<br>var S:String;<br>begin<br>S:=ExtractFilePath(Edit1.Text);<br>if ExtractRes('exefile','head',S+'head.exe') then<br>if Cjt_AddtoFile(Edit1.Text,S+'head.exe') then<br>if DeleteFile(Edit1.Text) then<br>if RenameFile(S+'head.exe',Edit1.Text) then<br>Application.MessageBox('文件加密成功!','信息',MB_ICONINFORMATION+MB_OK)<br>else<br>begin<br>if FileExists(S+'head.exe') then DeleteFile(S+'head.exe');<br>Application.MessageBox('文件加密失败!','信息',MB_ICONINFORMATION+MB_OK)<br>end;<br>end;<br>其中ExtractRes为自定义函数,它的作用是把head.exe从资源文件中取出来。<br>Function ExtractRes(ResType, ResName, ResNewName : String):boolean;<br>var<br>Res : TResourceStream;<br>begin<br>try<br>Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));<br>try<br>Res.SavetoFile(ResNewName);<br>Result:=true;<br>finally<br>Res.Free;<br>end;<br>except<br>Result:=false;<br>end;<br>end;<br>
 
后退
顶部