|
|
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
|
|
Példaprogram letöltése
19948 bájt
|
Az előző részben eljutottunk odáig, hogy készítettünk egy komponenst, amely a megadott meghajtó, illetve könyvtár tartalomjegyzékét elmentette egy fájlba. Most elkészítjük azt az alkalmazást, amely az ilyen módon elmentett tartalomjegyzékeket képes összehasonlítani, és a különbségeket megjeleníteni.
A tartalomjegyzék listák összehasonlítása során a következő négy eseményt ellenőrizzük:
- a fájl módosításának dátumának és időpontjának megváltozása, tehát az első lista után a fájl módosítva lett;
- a fájl méretének megváltozása, ami szintén a fájl módosítására utal;
- a fájl törlése;
- új fájl létrejötte.
Az előző részben a DirList komponenst úgy készítettük el, hogy az olyan listát generáljon, amelyben a fájlok legfontosabb adatai szerepelnek, és a formátumból következően egyből egy TreeVew komponensbe lehessen tölteni, átalakítások nélkül. A CmpDir felületét ezért úgy alakítjuk ki, hogy a régi, és az új tartalomjegyzék listának is felteszünk egy-egy TreeView komponenst a Form-ra. Bár a kiválasztott fájlok módosítás nélkül betölthetők, azért a betöltés után végigmegyünk az elemeken, és minden elemhez hozzárendelünk egy kis képet, amely jelöli, hogy könyvtárról vagy fájlról van-e szó, valamint rendezzük is a listát. Ezt a műveletet a betöltéssel együtt a LoadFileList eljárást végzi. Ennek két paramétere van, az első a TreeView komponens objektuma, a második pedig a fájl neve. Miután betöltöttük a fájlt, végigmegyünk a listán, és beállítjuk a képeket. Azt, hogy könyvtárról, vagy fájlról van-e szó, egy egyszerű vizsgálattal döntjük el. Ehhez tudni kell, hogy az első elem mindig a kiinduló könyvtár elérési útvonalát tartalmazza. A könyvtárak nevével együtt a teljes elérési útvonalat is tartalmazzák azok az elemek, amelyek könyvtárat reprezentálnak, míg a fájlok adatai nem, ráadásul azok a dátummal kezdődnek. Nyilvánvaló, hogy az elérési útvonalak minden esetben az első elemben tárolt elérési útvonallal kezdődnek, tehát ezt vizsgáljuk meg. Ha a feltétel teljesül, akkor az elem egy könyvtár nevét tartalmazza.
if Copy(TreeView.Items[i].Text, 1, length(d))=d then ...
Az összehasonlítás végeredménye szempontjából fontos, hogy az első lista legyen a régebbi (TreeView1 komponens). Ezt azért fontos, mert fordított esetben a megtalált törölt illetve új fájlok jelölése nem a valóságot tükrözi, hanem pont fordítva. A törölt fájlokat fogja újnak, míg az újakat töröltnek nyilvánítani. Ezen kívül az is fontos, hogy a két lista ugyanazon könyvtárról készüljön, hiszen ha az első elemekben tárolt elérési útvonal nem egyezik meg, akkor már eleve nem lehetséges a két lista összehasonlítása.
Az összehasonlítás a BitBtn1Click eljárásban történik meg. Első lépésben meghívjuk a StartStop eljárást egy hamis értékű logikai típusú paraméterrel. A StartStop eljárás annyit tesz, hogy a paramétertől függően beállítja az FQuit logikai típusú globális változó értékét, és a Form-on található kontrollokat engedélyezi, illetve letiltja. A feldolgozó ciklusok csak akkor futnak le, ha az FQuit változó értéke hamis, ellenkező esetben a feldolgozás megszakad.
Mielőtt elkezdenénk az összehasonlítást, elvégzünk két ellenőrzést. Az elsőben megvizsgáljuk, hogy mindkét TreeView komponensbe lett-e betöltve tartalomjegyzék lista. Természetesen csak akkor folytatjuk a feldolgozást, ha ez a feltétel teljesül.
A következő ellenőrzés a fent már említett feltételt vizsgálja, vagyis azt, hogy a két tartalomjegyzék ugyanazon könyvtárról készült-e.
Ha minden szükséges feltétel teljesült, akkor kezdődhet a listák tényleges összehasonlítása. A feldolgozás három lépésben történik meg. Az első lépésben a TreeView2 komponensben lévő listát átmásoljuk egy TStringList típusú objektumba (FileList). Ez egy látszólag felesleges lépés, hiszen a TreeView2 komponensben tárolt listán is ugyanúgy végig lehet haladni, mint egy TStringList objektumban tárolt listán. A TStringList objektumba másolt listával viszont megtehetjük azt a trükköt, hogy a már megtalált fájlt töröljük a listából. Így minden lépésben egyre kisebb listával kell az első lista aktuális elemét összehasonlítani, és ez jelentősen meggyorsítja a feldolgozást.
Az első lépés tehát a fájl lista átmásolása a TStringList objektumba. Az elemeket nem egy az egyben másoljuk, hanem a fájlok neve elé beillesztjük az elérési útvonalat is. A fájl adatait a GetFileData belső eljárással kérdezzük le.
A második lépés az első lista elemeinek összehasonlítása a FileList objektumban tárolt lista elemeivel. Egy ciklusban beolvassuk az első listában tárolt elemeket, és egy belső ciklusban összehasonlítjuk az aktuális elemet a FileList lista (rossz esetben) minden elemével.
Az egyezés vizsgálata a fájl nevének és elérési útvonalának összehasonlításával történik meg. Ha sikerült a fájlt megtalálni, akkor összehasonlítjuk a dátumot és méretet, és ha eltérést találunk, akkor a fájl adatait felvesszük a Form-on található ListView1 komponensbe. A megtalált fájlhoz tartozó elemet töröljük a FileList listából, és megszakítjuk a belső ciklust. Ha a belső ciklus lefutott, és a found változó értéke hamis, ez azt jelenti, hogy a keresett fájl nem található a FileList listában, tehát ez egy valószínűleg törölt fájl, ezért fel is vesszük a ListView1 objektumba.
Mire a harmadik lépéshez érünk, már megvannak azok a fájlok, melyeket törölve lettek, illetve a módosítás dátuma és időpontja, vagy a fájl mérete megváltozott. Sőt megvannak az újonnan létrehozott fájlok is, hiszen ezeket a FileList objektum tartalmazza. A harmadik lépésben tehát a FileList lista tartalmát átmásoljuk a ListView1 objektumba.
Néhány extra tulajdonsággal is kiegészítettük az alkalmazást. Az egyik, hogy amikor a ListView1 listából kiválasztunk egy fájlt, ha az nem egy új fájl, akkor a TreeView1 komponensben a kiválasztott fájl lesz kijelölve. Így összehasonlíthatók a fájl adatai a megváltozott adatokkal. Ehhez nem kellett mást tenni, csak a fájl adatinak a Listiew1 objektumba való tárolásakor elmenteni a TreeView1-ben lévő indexét. Ezt az AddFileToList eljárás megteszi úgy, hogy a paraméterként megkapott indexet a ListItem objektum Data property-jében eltárolja. Innen bármikor kiolvasható.
A másik extra kiegészítés az, hogy a különbség listát el is menthetjük egy egyszerű szerkezetű szöveges fájlba. A fájl szerkezete úgy lett kialakítva, hogy további feldolgozásra is alkalmas legyen.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 526. 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!
|