Thursday, May 10, 2007

sloučení souborů

Následuje funkce pro sloučení souborů. V parametru stačí specifikovat první z množiny souborů a jako výstupní parametr funkce dostanete zprávu o úspěšném provedení sloučení s kontrolou (v případě, že existuje kontrolní soubor), bez kontroly (pokud kontrolní soubor není k dispozici) či chybové hlášení, pokud součty nesouhlasí. Jak bylo již řečeno, kontrolu CRC musíte doplnit sami.
function Sloucit(FileName: String): String;
var
Source, Target : TFileStream;
Count : Integer;
Rect : LongInt;
Line, FName, AName, Size, CRC, CRC32, Dir, Files : String;
F : textFile;
begin
CRC := copy(FileName,1,Length(FileName)-3)+'crc';
Dir := ExtractFilePath(FileName);
Files := ExtractFileName(FileName);
Count := 0;
if FileExists(CRC) then
begin
AssignFile(F, CRC);
Reset(F);
while not EOF(F) do
begin
ReadLn(F, Line);
if copy(Line, 1, 8) = 'filename' then FName := copy(Line,10,Length(Line));
if copy(Line, 1, 4) = 'size' then Size := copy(Line, 6, Length(Line));
if copy(Line, 1, 5) = 'crc32' then CRC32 := copy(Line, 7, Length(Line));
end;
CloseFile(F);
end
else
begin
FName := copy(Files, 1, length(Files)-3) + 'out';
Size := '0';
CRC32 := '0';
end;
Target := TFileStream.Create(Dir + FName, fmCreate);
Rect := 0;
repeat
inc(Count);
AName := copy(Files, 1, length(Files)- 3);
AName := AName + copy('000',1,3-Length(IntToStr(Count)))+IntTostr(Count);
Source := TFileStream.Create(Dir + AName, fmOpenRead);
try
Rect := rect + Target.CopyFrom(Source, Source.Size);
except
Result := Format('Chyba při čtení svazku %s.',[FName]);
Source.Free;
Target.Free;
Exit;
end;
Source.Free;
AName := copy(Files, 1, length(Files)- 3);
AName := AName + copy('000',1,3-Length(IntToStr(Count+1)))+IntTostr(Count+1);
until not(FileExists(Dir + AName));
Target.Free;
if Rect = StrToInt(Size) then Result := 'Soubory byly úspěšně sloučeny (CRC souhlasí).'
else
begin
if (Size > '0') then Result := 'Chybná velikost sloučeného souboru.'
else Result := 'Soubory byly úspěšně sloučeny (bez CRC kontroly).';
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.OpenDialog1.Execute;
ShowMessage(Sloucit(Form1.Opendialog1.FileName));
end;

Labels: