Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Split / merge files

01.01.2007
{
 
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 zusammenfuhren
 
{
 
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;

Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php