当前位置:编程学习 > Delphi >>

怎样在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自带的帮助*}

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

补充:软件开发 , Delphi ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,