转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
怎样在DELPHI中实现文件切割/组合         ★★★★

怎样在DELPHI中实现文件切割/组合

作者:闵涛 文章来源:闵涛的学习笔记 点击数:817 更新时间:2009/4/23 18:25:00

  一、 文件切割/组合原理

  所谓文件切割,就是把一个文件切割成若干个小文件。做法就是将一个文件对象以"文件流"的方式读出,然后按照一定的块(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自带的帮助*}

  三、结束语

  在我们用到的很多日常工具中,有很多都会用到的"流"这个对象,它的作用也非常大,例如文件加密,文件下载等都会涉及到"流",所以笔者认为,掌握它是很有用的,也是比较重要的。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台