Listing 13


//Backup einer Datei auf einem Datenträger

var
   cancel: Boolean;
...

procedure MakeBackup(Filename, BackupPath: string);
var fs: TEXTFILE;
    s1, s2: TFileStream;
    BkfCount: Integer;
    FBytes, BBytes, ByteCount: LongInt;
    FName, FExt: string;

begin
if not FileExists(Filename) or not DirectoryExists(BackupPath) then begin caption:='Fehler'; Exit; end;

s1:=TFileStream.Create(Filename, fmOpenRead);

FName:=ChangeFileExt(ExtractFileName(Filename), ''); //Filename ohne Path u.Ext
FExt:=ExtractFileExt(ExtractFileName(Filename)); //FilenameExt
FBytes:=s1.size; //Dateigröße

//Backup-Liste sichern
AssignFile(fs, AddBackSlash(BackupPath)+FName+'.bst');
{$i-} Rewrite(fs); {$i+}

Writeln(fs, FName); //Filename ohne Path u. Ext
Writeln(fs, FExt); //FilenameExt
Writeln(fs, inttostr(FBytes)); //Dateigröße von Filename

CloseFile(fs);

//Backup starten

ByteCount:=FBytes; BkfCount:=1; cancel:=False;
while not cancel do
begin

   BBytes:=DiskFree(ord(AnsiUpperCase(BackupPath)[1])-64); //freie Bytes auf Datenträger

   if BBytes>500 then //wenigstens 500 sollten frei sein
   begin
      if ByteCount<BBytes then BBytes:=ByteCount;

      s2:=TFileStream.Create(AddBackSlash(BackupPath)+FName+inttostr(BkfCount)+'.bkp', fmCreate);
      s2.CopyFrom(s1, BBytes);
      s2.Destroy;

      inc(BkfCount); //zählt Backupfiles
      ByteCount:=ByteCount-BBytes; if ByteCount=0 then Break;
   end;

   if not cancel then
      if MessageDlg('Bitte nächsten Datenträger einlegen.', mtInformation, [mbYes, mbNo], 0) = mrNo then Break;
end; //while

s1.Destroy;
end;

...

procedure RemoveBackup(BackupList, Filepath: string);
var fo: TEXTFILE;
    s1, s2: TFileStream;
    BkfCount: Integer;
    FBytes, BBytes, ByteCount: LongInt;
    FName, FExt, FBytesCopy: string;

begin
if not FileExists(BackupList) or not DirectoryExists(Filepath) then begin caption:='Fehler'; Exit; end;

//Backupliste einlesen
AssignFile(fo, BackupList);
{$i-} Reset(fo); {$i+}

if not eof(fo) then Readln(fo, FName); //Filename ohne Phath u. Ext
if not eof(fo) then Readln(fo, FExt); //FilenameExt
if not eof(fo) then Readln(fo, FBytesCopy); FBytes:=strtoint(FBytesCopy); //Dateigröße von Filename

CloseFile(fo);

//Backup rückgängig machen

s1:=TFileStream.Create(AddBackSlash(Filepath)+FName+FExt, fmCreate);

ByteCount:=FBytes; BkfCount:=1; cancel:=False;
while not cancel do
begin
   //nächster Datenträger bitte ...
   if not FileExists(AddBackSlash(ExtractFilePath(BackupList))+FName+inttostr(BkfCount)+'.bkp') then
      if MessageDlg('Bitte nächsten Datenträger einlegen.', mtInformation, [mbYes, mbNo], 0) = mrNo then Break;

   //Datei konnte nicht auf dem eingelegten Datenträger gefunden werden->warten
   while not FileExists(AddBackSlash(ExtractFilePath(BackupList))+FName+inttostr(BkfCount)+'.bkp') do
      if MessageDlg('Konnte Datei nicht finden. Bitte anderen Datenträger einlegen.', mtInformation, [mbYes, mbNo], 0) = mrNo then Break;

   s2:=TFileStream.Create(AddBackSlash(ExtractFilePath(BackupList))+FName+inttostr(BkfCount)+'.bkp', fmOpenRead);
   BBytes:=s2.size;
   s1.CopyFrom(s2, BBytes);
   s2.Destroy;

   inc(BkfCount);
   ByteCount:=ByteCount-BBytes; if ByteCount=0 then Break;
end; //while

s1.Destroy;
end;

Zurück zur Hauptseite