当前页面位置: » 丰搜网 » 文档中心 » 详细内容
怎样在delphi中实现文件切割/组合
一、 文件切割/组合原理
所谓文件切割,就是把一个文件切割成若干个小文件。做法就是将一个文件对象以"文件流"的方式读出,然后按照一定的块(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自带的帮助*}
三、结束语
在我们用到的很多日常工具中,有很多都会用到的"流"这个对象,它的作用也非常大,例如文件加密,文件下载等都会涉及到"流",所以笔者认为,掌握它是很有用的,也是比较重要的。