HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Állomány archiváló komponens


Példaprogram letöltése

18288 bájt

Ebben a példában egy olyan komponenst készítünk, melynek segítségével egy kattintással megoldható az a feladat, hogy gyakran változó állományainkról egy biztonsági másolatot készítsünk a háttértárunk egy adott könyvtárába.

A komponens képes arra, hogy tetszőleges számban megadjunk számára különböző alkönyvtárakat és az itt található összes állományt átmásolja egy megadott helyre. Archiválás közben minden állomány másolása előtt egy esemény jön létre, ahol minden jellemző adatát (név, méret, dátumok, attribútumok, stb.) megkapjuk az adott állománynak. Ennél az eseménynél eldönthetjük, hogy az adott állomány is kerüljön másolásra vagy sem. Így tetszőleges szűrést valósíthatunk meg az archiválás folyamán. A komponens arra is képes, hogy igény szerint az adott alkönyvtárban lévő újabb alkönyvtárak tartalmát is másolja, akármilyen mélységig is vannak egymásba ágyazva az alkönyvtárak.

A mellékelt példaprogram megnyitása előtt a Backup.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Mellékelt példában a Folder1 és a Folder2 könyvtárak tartalmát archiváljuk a szintén mellékelt BackupFolder könyvtárba. Az archiválás folyamán a könyvtárak további alkönyvtárainak tartalma is másolásra kerül. A szűrésre is láthatunk példát: a 7000 bájtnál nagyobb állományokat nem másoljuk. Így a Folder1-ben lévő big.txt nem kerül másolásra.

A komponens használatához állítsa be a BaseBackupDir property-be azt a könyvtárat, amelyben az archiválandó állományokat szeretné viszontlátni.

Ha az AddDateToBackupDir property-t igazra állítja, akkor minden archiváláskor az aktuális dátum alapján létrejön egy új könyvtár a BaseBackupDir könyvtárán belül és a másolás ide történik. Például, ha a BaseBackupDir tartalma c:\backup\, akkor a 2001. szeptember 4-én a c:\backup\20010904\ könyvtárba történik a mentés. Ennek segítségével minden nap automatikusan más és más könyvtárba archiválhatunk.

Egy-egy állomány másolása előtt közvetlenül jön létre az OnBeforeCopy esemény. Itt kapunk egy DoCopy logikai típusú paramétert. Ennek alapértelmezett értéke igaz. Ha viszont itt hamisra állítjuk, akkor az adott állomány nem kerül másolásra.

Hogy mi legyen archiválva, azt az Items property-n keresztül tudjuk megadni. Mivel ez a TCollection-ból származó property, így itt tetszőleges számú elemet létrehozhatunk. Minden egyes elem egy-egy alkönyvtárt takar. Az egyes elemek két property-vel rendelkeznek. Az egyik a SourceDir, melyben a másolandó alkönyvtárt kell megadnunk, míg a másik a CopySubDir nevű logikai típusú property. Itt szabályozhatjuk, hogy az esetleges további alkönyvtárak tartalma is másolásra kerüljön-e vagy sem.

A TBackup komponens tartalmaz még számos csak olvasható property-t is. Ezek mind az aktuálisan másolandó állomány adatait tartalmazzák és csak akkor használhatóak, amikor a komponens OnBeforeCopy eseménye létrejön. Ekkor az alábbi property-k vizsgálatával dönthetjük el, hogy az adott állomány milyen tulajdonságokkal rendelkezik.
  • FileName - az állomány neve
  • FileSize - az állomány mérete bájtban
  • FileCreationTime - a létrehozás időpontja
  • FileLastAccessTime - az utolsó hozzáférés időpontja
  • FileLastWriteTime - az utolsó módosítás időpontja
  • FileAlternateName - az állomány alternatív neve

A FileIs kezdetű property-kből érhetjük el az állomány attribútum tulajdonságait. Ezek a property-k logikai típusúak. Így például, ha a FileIsReadOnly property igaz értékű, akkor az állomány csak olvasható tulajdonságú.

A másolás az Execute eljárás hívásával indítható el.

Itt egy egyszerű ciklussal végigmegyünk az Items tömb összes elemén és minden egyes esetben meghívjuk a CopyOneDir belső eljárásunkat, mely egy adott könyvtár tartalmát archiválja.
procedure TBackup.Execute;
var
  i: integer;
begin
  for i:=0 to FItems.Count-1 do begin
    FI:=i;                                  
    CopyOneDir(FItems[i].SourceDir);
  end;
end;
A CopyOneDir feladata, hogy megkeresse az adott könyvtárban lévő állományokat és gondoskodjon ezek lemásolásáról. Az állomány keresésről a FindFirstFile - FindNextFile - FindClose függvények gondoskodnak. Amennyiben keresés közben az adott találat attribútumai között szerepel a FILE_ATTRIBUTE_DIRECTORY konstans, akkor egy újabb alkönyvtárt találtunk. Ebben az esetben, ha a komponens Items property-ének adott elemében a CopySubDir property igaz értéket tartalmaz, akkor a talált alkönyvtárban lévő állomány másolásáról is gondoskodnunk kell. Ebben az esetben rekurzív módon meghívjuk a CopyOneDir eljárást, paraméterként átadva az új alkönyvtár elérési útvonalát. Ha állományt talál a kereső algoritmusunk, akkor először létrehozzuk az új könyvtárat a BaseBackupDir-en belül a ForceDirectories függvénnyel, majd a CopyOneFile belső eljárásunkkal lemásoljuk a talált állományt.
procedure TBackup.CopyOneDir(source: string);
var
  h: THandle;
  dest: string;
begin
  FActDir:=source;
  h:=FindFirstFile(PChar(source+'*.*'), FD);
  if h<>INVALID_HANDLE_VALUE then begin
    repeat
      if FD.cFileName[0]<>'.' then begin
        if (FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY=
               FILE_ATTRIBUTE_DIRECTORY) then begin
          if FItems[FI].CopySubDir then begin
            CopyOneDir(CheckFolder(source+FD.cFileName));
          end;
        end else begin
          dest:=source;
          Delete(dest, 1, 3);
          if FAddDateToBackupDir then begin
            dest:=FBaseBackupDir+FormatDateTime('
                 yyyymmdd', Now)+'\'+dest;
          end else begin
            dest:=FBaseBackupDir+dest;
          end;
          ForceDirectories(dest);
          CopyOneFile(source+FD.cFileName, dest+
                 ExtractFileName(FD.cFileName));
        end;
      end;
    until not FindNextFile(h, FD);
    Windows.FindClose(h);
  end;
end;
A CopyOneFile eljárás generálja az OnBeforeCopy eseményt. Itt még eldönthetjük, hogy az állomány legyen-e másolva vagy mégsem. Ha a másolás mellett döntünk, akkor a CopyFile függvénnyel elkészítjük az állomány másolatát a már létrehozott könyvtárba.
procedure TBackup.CopyOneFile(source, dest: string);
var
  b: boolean;
begin
  b:=true;
  if Assigned(FOnBeforeCopy) then begin
    FOnBeforeCopy(Self, b);
  end;
  if b then begin
    CopyFile(PChar(source), PChar(dest), false);
  end;
end;


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 146. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |