split/merge files?

Author: Rainer Kümmerle 

 

// Split file / File splitten

 

{

  Parameters:

 

  FileToSplit: Specify a file to split.

  SizeofFiles: Specify the size of the files you want to split to (in bytes)

  Progressbar: Specify a TProgressBar to show the splitting progress

 

  Result:

  SplitFile() will create files  FileName.001, FileName.002, FileName.003 and so on

  that are SizeofFiles bytes in size.

 }

 

function SplitFile(FileName : TFileName; SizeofFiles : Integer; ProgressBar : TProgressBar) : Boolean;

var

  i : Word;

  fs, sStream: TFileStream;

  SplitFileName: String;

begin

  ProgressBar.Position := 0;

  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);

  try

    for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do

    begin

      SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));

      sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);

      try

        if fs.Size - fs.Position < SizeofFiles then

          SizeofFiles := fs.Size - fs.Position;

        sStream.CopyFrom(fs, SizeofFiles);

        ProgressBar.Position := Round((fs.Position / fs.Size) * 100);

      finally

        sStream.Free;

      end;

    end;

  finally

    fs.Free;

  end;

 

end;

 

// Combine files / Dateien zusammenführen

 

{

  Parameters:

 

  FileName: Specify the first piece of the splitted files

  CombinedFileName: Specify the combined file name. (the output file)

 

  Result:

  CombineFiles() will create one large file from the pieces

 }

 

function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean;

var

  i: integer;

  fs, sStream: TFileStream;

  filenameOrg: String;

begin

  i := 1;

  fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);

  try

    while FileExists(FileName) do

    begin

      sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);

      try

        fs.CopyFrom(sStream, 0);

      finally

        sStream.Free;

      end;

      Inc(i);

      FileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));

    end;

  finally

    fs.Free;

  end;

end;

 

// Examples:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  SplitFile('C:\temp\FileToSplit.chm',1000000, ProgressBar1);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

  CombineFiles('C:\temp\FileToSplit.001','H:\temp\FileToSplit.chm');

end;