//功能:把分割的文件一块一块的读入到文件流中,然后再copy到内存流中,这样就完成了分割文件的合并操作,然后再把内存流保存为硬盘文件,但是,当分割的文件很大时(比如:一块50M,共有10块)时,tmemorystream将会变的很大很大,内存将不能容纳,合并速度会很慢,不知道能不能做出这样的程序:从文件流中读一块,合并工作可以保存为硬盘文件后再进行吗?或者有什么好的方法来合并这样的文件?像rar一样,当rar压缩再多再大的文件时,也不会出现内存使用500M的情况,我想知道这是怎么做的,谢谢!!分不是问题,可以再加!!
var
  tfi:tfileinfo;//是一个类,
  times:integer;
  flag:boolean;
  s:string;
begin
  s:=getfilename(listbox1.Items[0]);//得到文件名
  times:=0;
  flag:=true;
  form1.ProgressBar1.Max:=listbox1.Count;
  if listbox1.Count<>0 then
    begin
      try
        tfi:=tfileinfo.Create;
        tfi.filename:=form1.ListBox1.Items[0];
        tfi.position:=pos('.',tfi.filename);
        tfi.count:=form1.ListBox1.Count;  //得到listbox中的itme的条数
        try
          tfi.ms:=tmemorystream.Create;
          for times:=0 to tfi.count-1 do //合并添加到listbox中的文件
            begin
              tfi.fs:=tfilestream.Create(form1.ListBox1.Items[times],fmopenread);
              tfi.ms.CopyFrom(tfi.fs,0);
            end;
          tfi.ms.SaveToFile(getcurrentdir()+'合并后的'+s+tfi.exname1);//在当前文件夹下保存为文件
          tfi.ms.Free;
          tfi.Free;
        except
          tfi.ms.Free;
          flag:=false;
          messagebox(form1.Handle,pchar('读取文件出错!'),'提示',mb_ok or mb_iconwarning);
        end;
        if flag then
          begin
            messagebox(form1.Handle,pchar('文件合并成功!'+#13+'请到目录下:"'+getcurrentdir()+'\"去查看!'),'提示',mb_ok or mb_iconinformation);
            form1.ProgressBar1.Visible:=false;
          end;
      except
        tfi.Free;
      end;
    end
  else
    begin
      messagebox(form1.Handle,pchar('请正确选取您已分割的文件!'),'警告',mb_ok or mb_iconwarning);
    end;
end;
//先给40分,解决了另开贴,再加!!

解决方案 »

  1.   

    copy 1.dat+2.dat....用批处理简单,呵呵。
      

  2.   

    给出写文件头的实现方法,也给分;
    比如:.dat,.rm,.rmvb,.mp3,.wav ……,如何写入这样的文件头?
      

  3.   

    可能要用
            BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
            BlockWrite(ToF, Buf, NumRead, NumWritten);這樣, 我想
      

  4.   

    写文件头(以前在学习BMP文件格式时用过这样的方法):
    THeader = packed record
      B: Char;
      M: Char;
    end;var FHeader: THeader;
    begin
      FHeader.B := 'B';
      FHeader.M := 'M';  with TMemoryStream.Create do
      try
        WriteBuffer(FHeader, SizeOf(THeader));
        SaveToFile('C:\Budded.Dat');
      finally   // wrap up
        Free;
      end;      // try / finally
    end;
      

  5.   

    aiirii(ari-爱的眼睛):谢谢你,我按你的方法,差不多搞定了,但还没有完成最佳的效果,完全做好后,给分;
     同时也谢谢各位大侠的参与,谢谢!!
      

  6.   

    在合并后能不能是EXE文件,然后能自动解压的?
      

  7.   

    慢的原因:当合并或分割的文件很大时,内存使用很大,所以很慢,所以我改了一下,多亏aiirii(ari-爱的眼睛)大侠帮了一下,现在好多了,分割500多M的,十几秒吧,