Delphi - Tartalomjegyzék listák összehasonlítása és a különbségek kiértékelése

Tartalomjegyzék listák 1. rész

forráskód letöltése
Ebben a két részes cikkben készítünk egy olyan kis alkalmazást, amely képes egy háttértároló tartalomjegyzékéről készült régebbi, és egy újabb listát összehasonlítani úgy, hogy megjeleníti a két lista közötti különbséget. Ebből látható lesz, hogy a két lista készítése között eltelt időszakban mely fájlok változtak, törlődtek, illetve jöttek létre. Egy telepítés előtt és után készült tartalomjegyzék lista összehasonlításából például megtudhatjuk, hogy a telepítés közben milyen fájlok kerültek a rendszerre, illetve melyek módosultak.
A cikk első részében egy olyan komponenst készítünk, amely a megadott alkönyvtár tartalmát elmenti egy fájlba, amely fájl ezután közvetlenül beolvasható egy TreeView komponensbe, ahol a tartalomjegyzék hierarchikus elrendezésben látható. A lényegi feladat megoldására egy komponenst készítünk. A mellékelt példaprogram megnyitása előtt a DirList.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponensben megadható, hogy mely fájlok kerüljenek a listába, illetve az, hogy az alkönyvtárak tartalma is listázásra kerüljön-e. A fájlokra történő szűrést a fájl attribútumok megadásával lehet szabályozni. Ezeket az attribútumokat a FileAttributes tömb típusú (TFileAttributes) property-ben lehet megadni. Az ffDirectory értéknek csak akkor van jelentősége, ha a SubFolders property értéke hamis. Ellenkező esetben az alkönyvtárak mindenképpen beolvasásra kerülnek. A SubFolders property-vel azt adhatjuk meg, hogy a teljes tartalomjegyzék az alkönyvtárak tartalmával együtt (rekurzívan) beolvasásra kerüljön.

A beolvasás az Execute eljárás meghívásával történik. Ebben az eljárásban a FileAttributes property értékét át kell alakítani egy integer értékké, melyet a FindFirst függvénynél használunk fel a ScanDir eljárásban. Mielőtt azonban meghívnánk a ScanDir eljárást, még létrehozunk egy TFileStream típusú globális objektumot, amelyen keresztül a tartalomjegyzéket a FileName property-ben megadott fájlba másoljuk. Ha a fájl már létezett, akkor felülírjuk azt. Miután az objektumot létrehoztuk, rögtön el is mentjük a kiinduló könyvtár nevét a teljes elérési útvonallal együtt. Ezt a könyvtárat a Folder property-ben tudjuk megadni. Ezután már következhet a ScanDir eljárás meghívása.

A ScanDir egy rekurzívan hívható eljárás, aminek két paramétere van. Az első annak a könyvtárnak az elérési útvonala, amelynek tartalmát be kell olvasni, a második paraméter pedig egy egész szám, amely azt adja meg, hogy az adott alkönyvtár melyik szinten található. A kiinduló könyvtár tartalma az 1-es szinten található, ami azt jelenti, hogy a mentésnél egy darab Tab karakter (#9) kerül a fájl, vagy könyvtárnév elé. A második szinten lévő fájlok neve elé már két Tab karakter kerül, és így tovább. A második szintre a közvetlenül a kiinduló könyvtár alkönyvtáraiban található fájlok kerülnek. Az ilyen módon eltárolt fájl beolvasása egy TreeView-be a tartalomjegyzék hierarchikus megjelenítését teszi lehetővé.
A fájlok neve mellé eltároljuk a fájl méretét, és az utolsó módosítás dátumát és időpontját is, míg az alkönyvtáraknál csak az elérési útvonalra lesz szükség.

A cikk második részében elkészítjük azt az alkalmazást, amely képes a komponens által elmentett tartalomjegyzék listákat összehasonlítani, és a különbségeket kiértékelni.


Tartalomjegyzék listák cikksorozat

Tartalomjegyzék listák összehasonlítása és a különbségek kiértékelése - Tartalomjegyzék listák 1. rész

Tartalomjegyzék listák összehasonlítása és a különbségek kiértékelése - A tartalomjegyzék listák 2. rész