Monitoring változások a könyvtárak és fájlok 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, és volt egy véletlen találkozás egy hasonló feladatot - a változások nyomon követése egy bizonyos könyvtárba, és hozzon létre egy listát a feladatok szinkronizálni fájlokat a szerverre. Mivel eddig a pontig én soha nem fejleszteni ilyen algoritmusok, akkor már posherstiv terek az internet és gyűjteni annyi információt az adott témában. Nos, az eredmények az én kereső, úgy döntöttem, hogy a forma egy külön cikket a blog. Tehát a mai téma - változások nyomon követése a könyvtárak és fájlok Delphi jelent.

A legegyszerűbb és legkönnyebben megközelíthető, még azok számára, új programozási módszer változások követése a könyvtár egy munka időzítőt. Hogy mit jelent a munka abban a tényben rejlik, hogy az elején a program létrehoz egy listát a fájlok és alkönyvtárak a cél könyvtárban. Aztán az üzemidő az időzítő, egy új listát, és míg az előző - meghatározza, hogy mely fájlok kerültek, néhány eltávolított / áthelyezése stb és már bizonyos változtatásokat szinkronizálni műveleteket. Mivel ebben az ügyben, hogy meghatározzák, milyen, mondjuk a test.txt fájl módosítva lett? Például, akkor számíthat minden alkalommal a CRC-fájl, és hasonlítsa össze ezt az összeget, az előző érték. Itt látható a forrás funkció www.delphisources.ru. kiszámításához a CRC-fájl:

Példa a funkciót. Hozzon létre egy új alkalmazás a Delphi a következő komponensek formájában:


A fájl megnyitásakor fogja meghatározni a méretét és kiszámítja a CRC a fenti funkciók:

Most, hogy a szó hozzon létre egy fájlt, és írd meg a sorban, azt mondják: „Hello World!”, Mentse el, és futtassa a program kiszámítja a CRC. Itt van, mi történt a program:

Most újra megnyitja a fájlt, és cserélje sapkák tőke, azaz vonal lesz a "hello world!". Ismét kiszámítja a CRC:

Vegye figyelembe, hogy a fájl mérete ugyanaz, de a tartalma a fájl változott. Ez egy újabb példa arra, hogy a használata, mint egy kritérium csak a fájl méretét változások - nagyon megbízhatatlan lehetőség, és talán még rossz.

Mit lehet mondani a fenti lehetőségek által javasolt változások nyomon követése könyvtárban egy időzítőt?

A módszer előnye lehet nevezni az egyszerűség. Nem számít, milyen az időzítő fogják használni a munka - a standard TTimer vagy személyesen kialakított nagy pontosságú időmérő. Hang felvezető kiváltó időzítő tud valaki. De együtt az egyszerűség Ebben a megvalósításban ez is egy csomó hiányosságok. És a legfontosabb a hátránya - a megbízhatatlanság.

Senki sem ad biztosítékot arra, hogy a megadott intervallum időzítő működés elegendő lesz a végrehajtás a felvezető eljárást. Mint mondják, a felhasználó számítógépén - a sötétben. Akkor, persze, meg egy nagy mennyiségű időt és reméljük, hogy a felvezető működni fog 100% időzítő, de ez csak a „mankó”, de nem a problémák megoldását a megbízhatóság az algoritmus.

Ezen kívül, minden egyes alkalommal, hogy rendezni nagyszámú fájlok - az erőforrások pazarlását. 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.

És ezért racionálisabb változások nyomon követése, hogy a fájlok és könyvtárak használata a Windows-specifikus funkciókat. Itt meg tudjuk különböztetni két változata a munka:

  1. Változások nyomon követése a könyvtárba nélkül információkat jelenít meg a változásokat, azaz a egy egyszerű ténymegállapítás - változás volt, és hogy nem volt meghatározva megváltozott. Erre a módszer egy hármas funkció: FindFirstChangeNotification. FindNextChangeNotification. FindCloseChangeNotification.
  2. Változások nyomon követése a kimeneti könyvtárat információt a megváltozott terméket. Ehhez a módszerhez, egy pár funkciók: CreateFile és ReadDirectoryChangesW.

Mindkét módszer egyformán kényelmes, de néhány az alkalmazott módszerek egy adott helyzetben, ez rajtad múlik. Tekintsük a példák használata a Windows-specifikus funkciókat változások nyomon követése a könyvtárak.

Segítségével FindFirstChangeNotification funkciók FindNextChangeNotification, FindCloseChangeNotification

Mielőtt a tanulmány funkciók, hozzon létre egy modult-sablon a további munkához. Kövesse a változásokat mi lesz az áramlás (TThread):

Most tekintsük a kinevezését Windows-funkciókat.

FindFirstChangeNotification - létrehoz egy fogantyú változás bejelentések és állítsa be a kezdeti feltételeket az értesítés. A függvény egy fogantyút (THandle) INVALID_HANDLE_VALUE vagy hiba esetén:

lpPathName: PChar - teljes elérési útvonal a könyvtárat, amely birtokában van követés. Ez a paraméter nem tartalmazza a relatív útvonal, vagy egy üres karakterlánc.
bWatchSubtree: logikai - Igaz - azt jelzi, hogy a megfigyelés eredményeként csökkenni fog változásokat alkönyvtárat.
dwNotifyFilter: DWORD - készlet zászlók, amelyek meghatározzák a szűrő beállításait. Zászlók a következők lehetnek:

  • FILE_NOTIFY_CHANGE_FILE_NAME (0x00000001) - bármilyen változás a fájl nevét a könyvtár vagy alkönyvtár. A változások között átnevezése vagy törlése a fájlt.
  • FILE_NOTIFY_CHANGE_DIR_NAME (0x00000002) - bármilyen változás a könyvtár nevét egy könyvtárban vagy alkönyvtár. A változások között átnevezése vagy törlése könyvtárban.
  • FILE_NOTIFY_CHANGE_ATTRIBUTES (0x00000004) - bármilyen változás a vizuális attribútumok könyvtárat és alkönyvtárat.
  • FILE_NOTIFY_CHANGE_SIZE (0x00000008) - megváltoztatja a fájlok mérete a könyvtárban vagy alkönyvtárak. Átméretezés érzékeli, ha a fájl a lemezre.
  • FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010) - megváltoztathatja az utolsó bejegyzés a fájl idő.
  • FILE_NOTIFY_CHANGE_SECURITY (0x00000100) - biztonsági beállítások módosításához egy könyvtárban vagy alkönyvtár.

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: THandle - fogantyú nyert FindFirstChangeNotification funkciót.

FindCloseChangeNotification - leállítja a változások nyomon követésével a könyvtárban.

hChangeHandle: THandle - fogantyú nyert FindFirstChangeNotification funkciót.

Hozzárendelése funkciók már többé-kevésbé világossá vált számunkra - ott megszilárdítsa tudásukat a tapasztalat. Tehát, először is, mi áramot kell kapnia a két érték: a könyvtár elérési útját, amelyre fogjuk követni, és egy zászló jelzi, hogy a monitor alkönyvtárak. Írásban Flow Tervező:

Most fogunk létrehozni a következő Execute:

A fenti felvezető Execute mi változások nyomon követése egy fájlnevet / könyvtár, vagy fájl méretét. Ugyanakkor elvárjuk bármely esemény a szűrőt és egy üzenetet jelenít meg. By the way, hozzunk létre egy eseményt, hogy a változások az üzenetet, például a következő:

Most már készen állunk, hogy teszteljék a teljesítmény a patak. Hozzon létre egy új Delphi projekt fő formája meg a következő összetevőkből áll:

A modul használ csatlakozni a mi áramlását, és állapítsa meg a következő változókat:

Most írjuk a szükséges eseménykezelőkkel az eseményeket:

Indítsa el a programot, válassza ki azt a könyvtárat, amelynek meg szeretné tartani, és kattintson a „Follow” gombra. Most próbálja másolni / törölni minden fájlt, és meglátjuk, a Memo megfelelő üzenetet. Akkor szivattyú akár az e-book ingyen és azonnal öntsük egy könyvtárba csomó szöveges fájlok - megfelelő áramlását tájékoztatja Önt a változások könyvtár pontosan annyiszor, ha visszaállította a fájlt a könyvtárba.
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 - ez nem osztunk meg semmit. Nem tudjuk még ebben az esetben pontosan megmondani, hogy mi történt. 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.