如何合并、分割文件?请贴出源码

解决方案 »

  1.   


    function SplitFile(const FileName: string; Size: Cardinal): Boolean;
    var
      fStream: TFileStream;    {原始文件}
      toStream: TMemoryStream; {分文件}
      p,i: Integer;            {p 记录当前指针位置; i 记录这是第几个分的文件}
    begin
      Result := False;  Size := Size * 1024;     {把大小的单位转换为字节}  fStream := TFileStream.Create(FileName, fmOpenRead);
      p := 0;
      i := 0;  toStream := TMemoryStream.Create;  while p < fStream.Size do
      begin
        toStream.Clear;        {清空上次数据}
        fStream.Position := p; {放好指针位置}    if fStream.Size-p < Size then Size := fStream.Size-p; {最后一个时, 有多少算多少}    toStream.CopyFrom(fStream, Size); {复制}
        toStream.SaveToFile(FileName + '.' + IntToStr(i));        {保存}
        Inc(i);
        p := p + Size;
      end;  fStream.Free;
      toStream.Free;
      Result := True;
    end;
    //合并文件, 参数是其中一个分文件名
    function MergeFile(const FileName: string): Boolean;
    var
      ms: TMemoryStream; {读取分文件}
      fs: TFileStream;   {合并后的文件}
      path: string;
      i: Integer;
    begin
      path := ChangeFileExt(FileName,''); {去掉序号扩展名}
      ShowMessage(path);
      i := 0;  ms := TMemoryStream.Create;
      fs := TFileStream.Create(path, fmCreate);  while FileExists(path + '.' + IntToStr(i)) do
      begin
        ms.LoadFromFile(path + '.' + IntToStr(i));
        fs.CopyFrom(ms, 0); {TFileStream 不需要 SetSize; 但如果用 TMemoryStream 就需要}
        Inc(i);
      end;  ms.Free;
      fs.Free;
    end;
      

  2.   

    建议这样,
    合并文件时:
    1.把所有要合并的文件的信息如大小,名称和顺序写入一个a文件中
    2.创建合并后的文件b
    3.b文件的前两个字节存放文件a的大小,后8个字节存放文件名
    4.写入a文件
    5.按照a文件中的文件顺序,依次把各个要合并的文件写入
    6.合并文件结束
    分割文件时
    1.读取b文件的前2个字节,为a文件的大小
    2.读取b文件的后8个字节,为a文件的名称
    3.接着读出a文件
    4.根据a文件里的文件列表信息依次取出其它文件
    5.分割文件结束