ПредишенСледващото

При разработването на Delphi приложения за синхронизиране на всичко, например, файлове на различни компютри, един или друг начин трябва да се разработи алгоритъм, който може да бъде използван за идентификация на кои файлове трябва да бъдат отстранени от дадена директория, която се движи, преименувате, и т.н. Такива алгоритми и примери за използването им на практика, не са рядкост - в интернет можете да намерите много много различни Delphi-код варианти, които могат да се използват за проследяване на промените в Windows директории и файлове.

Не толкова отдавна, и имах случайна среща с подобна задача - да следите промените в определена директория, и да се създаде списък със задачи, за да синхронизирате файлове на сървъра. Тъй като до този момент аз не винаги се развиват тези алгоритми, че е posherstiv пространства на Интернет и да събере колкото се може повече информация по дадена тема. Е, резултатите от търсенето, реших да приеме формата на отделна статия в блога. Така че днес е на тема - следене на промените в директориите и файловете Delphi средства.

Най-простият и най-лесно достъпен, дори и за тези нови за метод за програмиране на проследяване на промените в директория е таймер работа. Смисълът на работата се състои в това, че в началото на програмата създава списък с файлове и поддиректории в целевата директория. След това, по време на работа на таймера, нов списък и в сравнение с предходната - определя кои са били добавени файлове, някои отстранения / преместени и т.н. и вече някои промени, за да синхронизирате операции. Както и в този случай да се определи какво, да речем, файлът test.txt е променен? Например, можете да очаквате всеки път, CRC файл и сравни тази сума с предишната стойност. Ето www.delphisources.ru източник функция. за изчисляване на CRC файл:

Пример на функцията. Създаване на ново заявление в Делфи със следните компоненти под формата на:


При отваряне на файл ще определи нейния размер и изчислява CRC на използването на посочените функции:

Сега вземете думата създадете файл и да го напиша в линията, да кажем "Hello World!", Запазете го и стартирайте програмата ще изчисли КРС. Ето какво се случи в програмата:

Сега отвори отново файла и да се замени капачки на капитала, т.е. Онлайн става "Здравей, свят!". Отново се изчисли на КРС:

Имайте предвид, че размерът на файла е същото, но съдържанието на файла се е променило. Това е още един пример за това, че използването като критерий само размера на промяната на файла - това е много ненадежден вариант, а може би дори и погрешно.

Какво може да се каже и за по-горните варианти, предложени от следене на промените в указателя с таймер?

Предимството на този метод може да се нарече своята простота. Без значение какъв е таймерът ще се използват в работата - стандартен TTimer или лично изработени с висока точност таймер. Hang манипулатор за задействане на таймера може ли някой. Но заедно с простотата на този вариант, той също има много недостатъци. И най-важното от недостатъци - ненадеждността.

Никой няма да ви даде увереност, че на определен интервал операцията таймер ще бъде достатъчен за изпълнение на процедурата по манипулатор. Както се казва, компютъра на потребителя - тъмнината. Можете, разбира се, задаването на голям период от време и се надявам, че водачът ще работи на 100% таймер, но това е само една "патерица", но не е решение на проблемите, свързани с надеждността на алгоритъма.

Освен това, всеки път, за да сортирате голям брой файлове - загуба на ресурси. Разбира се, в тази възраст на многоядрени процесори, компютърни ресурси са много големи, но и да ги хвърлят върху и без - не си заслужава, особено ако работите върху създаването на сериозна изискващ ресурси проект, където всеки броя байтове.

И, следователно, по-рационален начин за наблюдение на промените файлове и директории е да се използва Windows-специфични функции. Тук можем да се разграничат два варианта на работа:

  1. Мониторинг на промените в директорията, без показване на информация за промените, т.е. проста констатация - че е настъпила промяна, както и че не е било определено е бил променен. За този метод използва тройна функция: FindFirstChangeNotification. FindNextChangeNotification. FindCloseChangeNotification.
  2. Мониторинг на промените в изходната директория с информация за променените елементи. За този метод, чифт функции: CreateFile и ReadDirectoryChangesW.

И двете от тези методи са еднакво удобни, но някои от най-използваните в определена ситуация методи, това е до вас. Да разгледаме примери за използване на Windows-специфични функции за следене на промените в директориите.

Използването FindFirstChangeNotification функции, FindNextChangeNotification, FindCloseChangeNotification

Преди да се пристъпи към изучаването на функции, създаване на модул-шаблон за по-нататъшна работа. Следвайте промените, които ще бъдат в потока (TThread):

Сега помислете за назначаване на Windows функции.

FindFirstChangeNotification - Създава уведомления дръжка на климата и да зададете първоначално обявените условия за уведомяване. Функцията връща дръжка (THandle) INVALID_HANDLE_VALUE или в случай на грешка:

lpPathName: PChar - пълен път до директорията, за която се провежда за проследяване. Този параметър не може да съдържа относителния път, или празен низ.
bWatchSubtree: Булева - Вярно - показва, че в резултат на мониторинга ще падне промени в поддиректории.
dwNotifyFilter: DWORD - набор от флагове, които определят настройките на филтъра. Знамена могат да бъдат следните:

  • FILE_NOTIFY_CHANGE_FILE_NAME (0x00000001) - всяка промяна в името на файла в директория или поддиректория. Промените включват преименуване или изтриване на файлове.
  • FILE_NOTIFY_CHANGE_DIR_NAME (0x00000002) - всяка промяна в името на директорията, в директория или поддиректория. Промените включват преименуване или изтриване на директория.
  • FILE_NOTIFY_CHANGE_ATTRIBUTES (0x00000004) - всяка промяна в гледането атрибути директория и поддиректориите.
  • FILE_NOTIFY_CHANGE_SIZE (0x00000008) - промяна на размера на файла в директорията, или поддиректории. Промяна в размера се открива само когато файлът се записва на диск.
  • FILE_NOTIFY_CHANGE_LAST_WRITE (0x00000010) - промяна на последния запис в момента на файла.
  • FILE_NOTIFY_CHANGE_SECURITY (0x00000100) - промените настройките за защита в една директория или поддиректория.

FindNextChangeNotification - показва, че операционната система е върнал известието за THandle сигнал за промяна в следващия път, когато се установят промени, според филтър монтиран функция FindFirstChangeNotification на.

hChangeHandle: THandle - дръжка получен чрез функция FindFirstChangeNotification.

FindCloseChangeNotification - спира мониторинга на промените в указателя.

hChangeHandle: THandle - дръжка получен чрез функция FindFirstChangeNotification.

Присвояване на функции вече са малко или много да станат ясни за нас - има консолидира своите знания чрез опит. Така че, на първо място, нашият поток трябва да получат две стойности: пътя до директорията, за която ще следваме, и се обозначава дали или не да се следи поддиректории. Писане дизайнер на потока:

Сега ние ще създадем следващата Изпълнение:

В горния манипулатор Execute следим промените в името на файла / директорията, или размера на файла. В същото време ние очакваме на някое от събитията във филтъра и да покаже съобщение. Между другото, нека да създадете събитие да доведат до съобщението за промени, например, е:

Сега ние сме готови да се тества ефективността на нашия поток. Създаване на нов проект, Delphi и основната форма определя от следните компоненти:

Модулът използва се свържете с нашия поток и да обяви от следните променливи:

Сега пиша необходимите манипулатори на събития за събитията:

Стартирайте програмата, изберете директорията, за която искате да запазите и натиснете бутона "Follow" бутона. Сега се опитайте да копирате / изтриване на всички файлове и ще видим в Memo подходящо съобщение. Можете да се помпа електронна книга безплатно и веднага се изсипва в директория куп текстови файлове - потокът правилно ви информира за промените директорията точно толкова пъти, колкото можете възстановите файла в директорията.
Горният пример е може би най-простите, когато следим само едно събитие от които просто се посочва, е факт - има промени в указателя. И това, което се променя - това ние не споделят нищо. Ние не можем да дори и в този случай да се каже точно какво се е случило. Можете леко коригира над процесора и с помощта на посочените по-горе функции на Windows да се определят различни събития за всяка опция промени, вместо да се използва най-WaitForSingleObject функция функция WaitForMultipleObjects. Но това, както и използването на методи CreateFile ReadDirectoryChangesW и ще говорим следващия път.

Подкрепете проекта - споделете линка, благодаря!