A könyvtárak és fájlok változásainak felügyelete delphi segítségével

A fejlődő Delphi alkalmazások szinkronizálni semmit, például a fájlok különböző számítógépeken, vagy olyan módon kell fejleszteni egy olyan algoritmus, amely felhasználható egyedi azonosítására mely fájlokat kell távolítani egy adott könyvtár, ami mozog, átnevezés, stb Ilyen algoritmusok és példái azok használatát a gyakorlatban nem ritka - az interneten megtalálható egy csomó nagyon különböző Delphi-kód variációk, hogy lehet használni a változások nyomon követése a Windows könyvtárakat és fájlokat.

Nem is olyan régen találkoztam ilyen feladattal - nyomon követni a változásokat egy adott könyvtárban, és létrehozni egy feladatsorozatot a fájlok szinkronizálásához a kiszolgálóval. Mivel korábban nem fejlesztettem ki ezeket az algoritmusokat, meg kellett keverednem az internet kiterjedéseit és gyűjtsön annyi információt a témáról, amennyire csak lehetséges. Nos, úgy döntöttem, hogy a keresések eredményeit külön cikk formájában adom ki a blogban. Tehát a mai téma a könyvtárak és fájlok változásainak nyomon követése a Delphi segítségével.

A legegyszerűbb és legegyszerűbben elérhető módja annak, hogy még az újonnan érkezők is programozhassanak a könyvtárban végrehajtott változtatások nyomon követésére, az az időzítő. A munka értelme, hogy a program elején létrehozza a célkönyvtárban lévő fájlok és alkönyvtárak listáját. Ezután az időzítő aktiválása pillanatában új lista jön létre, és összehasonlításra kerül az előzővel - meghatározza, mely fájlokat adtak hozzá, melyeket töröltek / költöztek stb. és a szinkronizálási műveleteket már előre meghatározott változásokra végzik. Hogyan lehet ez esetben megállapítani, hogy a Test.txt fájl megváltozott? Például minden CRC-fájlt kiszámíthat, és összehasonlíthatja ezt az összeget az előző értékkel. Itt található a www.delphisources.com oldal funkciója. a CRC fájl kiszámításához:

Példa a funkció használatára. Hozzon létre egy új alkalmazást Delphi-ben, az alábbi összetevőkön az űrlapon:


Fájl megnyitásakor meghatározzuk a méretét és kiszámítjuk a CRC-t a fenti függvény használatával:

Most hozzunk létre egy szöveges fájlt, írjunk egy sort, mondjuk Hello World !, mentse el, futtassa a programot és kiszámolja a CRC-t. Íme, mi történt a programban:

Most nyissa meg újra a fájlt, és nagybetűkkel helyettesítse a nagybetűket. a karakterlánc úgy fog kinézni, mint a "hello világ!". Ismét kiszámítjuk a CRC-t:

Vegye figyelembe, hogy a fájlméret megegyezik, és a fájl tartalma megváltozott. Ez egy további példa arra a tényre, hogy a fájl megváltoztatásának kritériumaként csak a mérete nagyon megbízhatatlan, és valószínűleg még helytelen is.

Mit mondhatunk a könyvtár módosításának javasolt verziójáról egy időzítő segítségével?

Ennek az eljárásnak az előnye az egyszerűség. Nem számít, hogy melyik időzítőt használják - egy szabványos TTimer vagy egy nagy pontosságú időzítő, amelyet önmagában hoztak létre. Bárki felakaszthatja a kezelőt az időzítőre. De ezen lehetőség egyszerűsége mellett sok hibája is van. És a legfontosabb hiányosságok a megbízhatatlanság.

Senki nem ad garanciát arra vonatkozóan, hogy az időzítő működésének meghatározott időzítése elegendő lehet a kezelő eljárásának elvégzéséhez. Mint mondják, a felhasználó számítógépének sötét. Természetesen hosszú időintervallumot állíthat be, és remélheti, hogy az időzítő kezelője 100% -ban működni fog, de ez csak egy "mankó", de nem megoldás az algoritmus megbízhatósági problémáira.

Ezenkívül minden alkalommal, amikor nagyszámú fájlt rendezünk - felesleges erőforrások pazarlásával. Természetesen ebben a korban a többmagos processzorok, a számítógép erőforrásait nagyon nagy, hanem dobja át őket, és anélkül, hogy - nem éri meg, főleg, ha dolgozik a létrehozása komoly erőforrás-igényes projekt, ahol minden byte számít.

Ezért a fájlok és könyvtárak módosításának racionálisabb módja a Windows-funkciók használata. Kétféle módon lehet dolgozni:

  1. Figyelemmel kísérheti a változásokat a könyvtárban, anélkül, hogy információt szolgáltatna a változásokról, pl. egy egyszerű ténymegállapítás - volt változás, és pontosan mi változott, nem határozzák meg. Ehhez a módszerhez három funkciót használunk: FindFirstChangeNotification. FindNextChangeNotification. FindCloseChangeNotification.
  2. A könyvtár változásainak figyelése a módosított elemek információinak kimenetével. Ehhez a módszerhez két funkciót használunk: CreateFile és ReadDirectoryChangesW.

Mindkét módszer egyformán kényelmes, de ezek közül az utóbbiak közül melyiket alkalmazhatja egy adott helyzetben Öntől függ. Tekintse meg a Windows funkciók használatának példáit a könyvtárak változásainak figyelemmel kíséréséhez.

A FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification

Mielőtt folytatnánk a funkciók tanulmányozását, létrehozunk egy beszerzési modult a további munkákhoz. Mi követi a menetben bekövetkezett változásokat (TThread):

Most fontold meg a Windows funkcióinak célját.

FindFirstChangeNotification - létrehoz egy változás értesítési leíróját, és meghatározza az értesítés küldésének kezdeti feltételeit. A függvény egy hiba esetén író (THandle) vagy INVALID_HANDLE_VALUE értéket ad vissza:

lpPathName: A PChar a könyvtár teljes elérési útja, majd a követés. A paraméter értéke nem tartalmazhat relatív útvonalat vagy üres karakterláncot.
bWatchSubtree: boolean - True - azt jelzi, hogy az alkönyvtárakban bekövetkezett változások is bekövetkeznek a monitoring eredményben.
dwNotifyFilter: A DWORD a szűrők beállításait meghatározó zászlókészlet. A zászlók lehetnek:

  • FILE_NOTIFY_CHANGE_FILE_NAME (0x00000001) - a fájlnév változása a könyvtárban vagy alkönyvtárban. A módosítások közé tartozik a fájl átnevezése, létrehozása vagy törlése.
  • FILE_NOTIFY_CHANGE_DIR_NAME (0x00000002) - a könyvtár nevének bármilyen változása egy könyvtárban vagy alkönyvtárban. A módosítások közé tartozik a könyvtár átnevezése, létrehozása vagy törlése.
  • FILE_NOTIFY_CHANGE_ATTRIBUTES (0x00000004) - a beolvasott könyvtárban és alkönyvtárakban lévő attribútumok változása.
  • FILE_NOTIFY_CHANGE_SIZE (0x00000008) - módosítsa a fájl méretét egy könyvtárban vagy alkönyvtárban. A méretezés csak akkor észlelhető, ha a fájlt lemezre írta.
  • FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010) - az utolsó rekord időtartamának módosítása a fájlban.
  • FILE_NOTIFY_CHANGE_SECURITY (0x00000100) - módosítsa a biztonsági beállításokat egy könyvtárban vagy alkönyvtárban.

FindNextChangeNotification - azt jelzi, hogy az operációs rendszer visszatért az értesítést THandle változás jel a következő alkalommal, amikor változtatásokat felfedezett szerint a szűrő telepítve funkció FindFirstChangeNotification.

hChangeHandle: A THandle a FindFirstChangeNotification funkcióval kapott leíró.

FindCloseChangeNotification - leállítja a könyvtár módosításainak figyelését.

hChangeHandle: A THandle a FindFirstChangeNotification funkcióval kapott leíró.

A funkciók ma már többé-kevésbé egyértelművé válnak számunkra - továbbra is meg kell erősíteni a megszerzett tudást a tapasztalatokból. Tehát először is a szálunknak két értéket kell kapnia: a könyvtár elérési útját, amely mögött követni fogjuk, és a zászló jelzi, hogy figyelemmel kísérjük-e az alkönyvtárakat. Mi írjuk az áramlástervezőt:

Most hozd létre a következő Execute:

A fenti Futtatáskezelőben figyelemmel kísérjük a fájl / könyvtár vagy fájl méretének változását. Ebben az esetben a szűrőben szereplő események bármelyikét várjuk, és üzenetet küldünk. Egyébként hozzon létre egy eseményt, amelyen megjelenik egy üzenet a változásokról, például:

Most minden készen áll a tesztelésünk tesztelésére. Hozzon létre egy új Delphi projektet, és tegye a következő összetevőket a fő formára:

Az alkalmazásokban a modulot a szálunkhoz csatlakoztatjuk és deklaráljuk a következő változót:

Most írja meg a szükséges kezelőket az eseményekhez:

Futtassa a programot, válassza ki a megfigyelni kívánt könyvtárat, és kattintson a "Követés" gombra. Most megpróbálunk másolni / törölni egy fájlt, és megnézni egy megfelelő üzenetet a Memo-ban. Az e-könyveket ingyen szivattyúzhatja, és egy csomó szöveges fájlt beolvashat a könyvtárba - az adatfolyam pontosan tájékoztatja Önt arról, hogy a könyvtár változik pontosan annyi alkalommal, mint amennyi fájl a könyvtárba esik.
A fenti példa talán a legegyszerűbb, ha nyomon követjük csak egy esetben, hogy csak arról tény - változások voltak a könyvtárban. És mi változik - mi nem tájékoztatjuk erről. Nem mondhatjuk el, hogy mi történt ebben az esetben. Akkor kicsit változtasson a fenti processzor és a fenti funkciókat a Windows meghatározni különböző eseményeket az egyes lehetőségek változások helyett a WaitForSingleObject függvényt WaitForMultipleObjects. De ez, valamint a módszerek CreateFile ReadDirectoryChangesW és beszélni fogunk legközelebb.