怎样在DELPHI中实现文件切割/组合
2008-02-23 07:14:13来源:互联网 阅读 ()
所谓文件切割,就是把一个文件切割成若干个小文件。做法就是将一个文件对象以"文件流"的方式读出,然后按照一定的块(Block)大小分别存成文件。文件组合,就是把若干个文件组合成一个文件。比如像打包工具(Wise)用到的就是这个原理。如果大家对"流"这个概念熟悉的话,那么实现起来就很容易了,以下就是实现步骤。
二、 实现
在Delphi中新建一个工程,然后在窗体中加入两个BUTTON,一个EDIT,一个OPENDIALOG,一个SAVEDIALOG,再将BUTTON1的CAPTION改为"切割",BUTTON2的CAPTION改为"组合"(注:其它控件的属性略)。再双击BUTTON1和BUTTON2,写下如下代码:
//切割文件 procedure TForm1.Button1Click(Sender: TObject); var i, WantedFragSize, RealToWrite : Integer; //声明两个文件流对象 //InStream为输入源文件流对象,OutStream为输出切割文件流对象 InStream, OutStream : TFileStream; S : String; begin if Opendialog1.Execute then begin SaveDialog1.Title := '输入你要保存的切割文件名'; If SaveDialog1.Execute then begin WantedFragSize := StrtoInt(Edit1.Text); //定义切割块大小 i := 0; //以只读的方式创建一个输入文件流对象 InStream:=TFileStream.Create( OpenDialog1.FileName,fmOpenRead); Try //如果Instream流的当前指针位置不在末尾,就按照定义的块大小//来读出数据并存成文件 while (InStream.Position < InStream.Size) do Begin s := IntToStr(I); while Length(s) < 3 do s := '0' s; s := '.' s; //生成切割文件的扩展名,用三位数字来作为扩展名,方便组合文件 //如果InStream所剩的块大小小于定义的块大小,则将剩下的块数//据存成文件 If InStream.Size - InStream.Position < WantedFragSize then RealToWrite := InStream.Size - InStream.Position else RealToWrite := WantedFragSize; //创建一个输出文件流对象 OutStream:=TFileStream.Create(SaveDialog1.FileName s,fmCreate); try OutStream.CopyFrom(InStream,RealToWrite); Inc(i); Finally //释放输出文件流对象 OutStream.Free; end; end; Finally InStream.Free; end; end; end; end; //组合文件 procedure TForm1.Button2Click(Sender: TObject); var i : Integer; InStream, OutStream : TFileStream; SourcePath, FragName, S : String; begin Opendialog1.Title := '请选择切割文件'; if Opendialog1.Execute then begin //得到当前打开的切割文件的路径 SourcePath := ExtractFilePath(Opendialog1.FileName); //得到当前打开的切割文件的文件名 FragName := ExtractFileName(Opendialog1.FileName); SaveDialog1.Title := '请输入你要组合的文件名'; If SaveDialog1.Execute then begin i := 0; s := IntToStr(I); while Length(s) < 3 do s := '0' s; s := '.' s; FragName := ChangeFileExt(FragName, s); //如果目录中有以.000为扩展名的文件存在,则创建一个输出文件流//对象 If FileExists(SourcePath FragName) then begin OutStream:=TFileStream.Create(Savedialog1.FileName,fmCreate); Try //按照以文件扩展名递增的方式组合文件 While FileExists(SourcePath FragName) do Begin InStream:=TFileStream.Create(SourcePath FragName,fmOpenRead); Try //将输入文件流的数据写入到输出文件流中 OutStream.CopyFrom(InStream,0); Inc(i); s := IntToStr(I); while Length(s) < 3 do s := '0' s; s := '.' s; FragName := ChangeFileExt(FragName, s); finally InStream.Free; end; end; finally OutStream.Free; end; end; end; end; end;
{*注释:请注意COPYFROM方法的使用,当第二个参数为0时,表示将输入流InStream的数据全部写入输出流OutStream;当大于0为N时,表示从输入流InStream的当前流指针位置开始,将N个字节数据写入输出流OutStream,并且InStream的流指针会向后偏移N个字节位数。详细解释请查看DELPHI自带的帮助*}
三、结束语
在我们用到的很多日常工具中,有很多都会用到的"流"这个对象,它的作用也非常大,例如文件加密,文件下载等都会涉及到"流",所以笔者认为,掌握它是很有用的,也是比较重要的。
上一篇: Delphi设计可中/英文切换的界面技巧
下一篇: 用Delphi进行OpenGL编程学习心得 (1)
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用修改文件时间的方法来加密文件
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash