Wednesday, May 09, 2007

Druhá část, funkce na sloučení souboru, celkem logicky provádí opačný postup. Po specifikování prvního souboru jsou jednotlivé soubory spojeny a je provedena kontrola na základě kontrolního souboru (kontrola CRC je opět vynechána).
Procedura na rozdělení souboru s ukázkou následného použití tedy vypadá takto:
procedure Rozdelit(FileName: String; part:integer);
var
Source, Target : TFileStream;
Fname, Ext : String;
Count, Rest,
Size : Integer;
F : TextFile;
begin
Source := TFileStream.Create(FileName, fmOpenRead);
Fname := copy(FileName,1,Length(FileName) - 4);
Count := 0;
Size := Source.Size;
if Source.Size <= Part then
begin
ShowMessageFmt('Vybraný soubor je menší než %d bajtů. Není třeba jej dělit.',[Part]);
Exit;
end;
repeat
Rest := 0;
Inc(Count);
Ext := copy('000', 1, 3 - Length(IntToStr(count))) + IntToStr(Count);
Target := TFilestream.Create(Fname + '.' + Ext, fmCreate);
try
if (count * Part) <= Size then Rest := Target.CopyFrom(Source, Part)
else Rest := Target.CopyFrom(Source,Size mod Part);
except
end;
Target.Free;
until Rest <> Part;
AssignFile(f, Fname + '.crc');
Rewrite(f);
WriteLn(f,'filename='+ExtractFileName(FileName));
WriteLn(f,'size='+IntToStr(Size));
WriteLn(f,'crc32=');
CloseFile(f);
Source.Free;
ShowMessageFmt('Soubor byl rozdělen na %d souborů',[count]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.OpenDialog1.Execute;
Rozdelit(Form1.Opendialog1.FileName, 307200);
end;
Jak vidíte, je využit dialog na otevření souboru a je tedy třeba jej přidat na formulář. Specifikovaný soubor bude rozdělen na soubory o velikosti 300 kB.