...split/merge files?

Author: Rainer Kümmerle
Homepage: http://www.thinklazy.de

Category: Files

// 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;

 

printed from
www.swissdelphicenter.ch
developers knowledge base