Оповещение об изменениях в файловой системе
Многие программисты задавались вопросом: как получить сигнал от операционной системы о том, что в файловой системе произошли какие-то изменения? Такой вид оповещения позаимствован из ОС 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;
Приложение готово. Чтобы оно стало полнофункциональным, предусмотрите в нем механизм перезапуска потока при изменении обследуемой папки.