Информационные технологииStfw.Ru 🔍

Оповещение об изменениях в файловой системе

ГЛАВА 9. Файлы и устройства ввода/вывода
🕛 14.11.2006, 18:43
Многие программисты задавались вопросом: как получить сигнал от операционной системы о том, что в файловой системе произошли какие-то изменения? Такой вид оповещения позаимствован из ОС UNIX и теперь доступен программистам, работающим с Win32.

Для организации мониторинга файловой системы нужно использовать три функции - FindFirstChangeNotification, FindNextChangeNotification И FinddoseChangeNotification. Первая из них возвращает дескриптор объекта файлового оповещения, который можно передать в функцию ожидания. Объект активизируется тогда, когда в заданной папке произошли те или иные изменения (создание или уничтожение файла или папки, изменение прав доступа и т. д.). Вторая функция - готовит объект к реакции на следующее изменение. Наконец, с помощью третьей функции следует закрыть, ставший ненужным, объект.

Так может выглядеть код метода Execute потока, созданного для мониторинга:

var DirName : string;

...

procedure TSimpleThread.Execute;
var r: Cardinal;

fn : THandle;

begin

fn := FindFirstChangeNotification(pChar(DirName),True, FILE_NOTIFY_CHANGE_FILE_NAME);

repeat

r := WaitForSingleObject(fn,2000);

if r = WAIT_OBJECT_0 then Forml.UpdateList;

if not FindNextChangeNotification(fn) then break;

until Terminated;

FinddoseChangeNotification (fn) ;
end;

На главной форме должны находиться компоненты, нужные для выбора обследуемой папки, а также компонент TListBox, в который будут записываться имена файлов:

procedure TForml.ButtonlClick(Sender: TObject);

var dir : string;

begin

if SelectDirectory(dir, [],0) then

begin

Editl.Text := dir; DirName := dir;

end;

end;

procedure TForml.UpdateList; var SearchRec: TSearchRec;

begin

ListBoxl.Clear;

FindFirst(Editl.Text+'\*.*', faAnyFile, SearchRec);

repeat ListBoxl.Items.Add(SearchRec.Name);

until FindNext(SearchRec) <> 0;

FindClose(SearchRec);
end;

Приложение готово. Чтобы оно стало полнофункциональным, предусмотрите в нем механизм перезапуска потока при изменении обследуемой папки.

Cамоучитель по Delphi   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉