Мониторинг изменений в файловой системе

Если вам необходимо следить за изменениями файлов в одном или нескольких каталогах (например, содержащих файлы журнала и дампы памяти), вы можете использовать экземпляр типа МониторФайловойСистемы. Функция мониторинга поддерживается для всех операционных систем (Windows, Linux и macOS).

Чтобы начать работу с монитором, вызовите метод Отслеживать() типа МониторФайловойСистемы и укажите каталог для отслеживания, как описано ниже. Для завершения работы монитора вызовите метод Закрыть().

Задать каталог для отслеживания изменений

Создайте экземпляр типа Файл и передайте его в метод Отслеживать() типа МониторФайловойСистемы, чтобы задать путь к каталогу, изменения в котором вы хотите отслеживать. Если каталог не найден или указанный элемент файловой системы не является каталогом, то выбрасывается ИсключениеНедопустимыйАргумент.
пер Каталог = новый Файл("C:\\TargetDirectory")
исп Монитор = новый МониторФайловойСистемы()
Монитор.Отслеживать(Каталог)
Если указанный каталог содержит вложенные каталоги, вы можете использовать параметр Глубина, чтобы указать, сколько уровней вложенности должен учитывать монитор при отслеживании изменений:
Монитор.Отслеживать(Каталог, Глубина = 3)
Если вам необходимо отслеживать изменения только определённых файлов в каталоге, используйте параметр ИменаФайлов, чтобы указать нужные файлы. Вы можете задать шаблон поиска или регулярное выражение для фильтрации файлов. Например, чтобы отслеживать изменения только в лог-файлах, используйте следующий фильтр:
Монитор.Отслеживать(Каталог, ИменаФайлов = "*.log")

Указать вид событий для отслеживания

Элементы перечисления ВидСобытияФайловойСистемы позволяют вам указать, какие виды событий файловой системы необходимо отслеживать. Поддерживаются следующие виды событий:

  • Создание — создание файла или подкаталога;
  • Удаление — удаление файла или подкаталога;
  • Изменение — изменение файла или подкаталога;
  • ПотеряСобытий — специальное событие, указывающее на потерю событий файловой системы. Это происходит, когда файловая система не успевает обработать поступающие события и буфер событий переполняется. Рекомендуем вам обрабатывать это событие отдельно: например, полностью пересмотреть каталог и заново выполнить все необходимые операции.
В примере ниже показано, как отслеживать появление новых файлов в каталоге:
пер Каталог = новый Файл("C:\\TargetDirectory")
исп Монитор = новый МониторФайловойСистемы()
Монитор.Отслеживать(Каталог, ВидыСобытий = ВидСобытияФайловойСистемы.Создание) 

Получить и обработать события файловой системы

Для получения и обработки событий файловой системы используйте метод ПолучитьСобытия() типа МониторФайловойСистемы. Данный метод возвращает массив объектов СобытиеФайловойСистемы, содержащих информацию о полученных событиях (вид события и Файл, для которого это событие произошло). Используйте параметр Таймаут, чтобы указать длительность ожидания новых событий, если в данный момент очередь событий пуста. Если по истечении указанного времени ни одно событие не произошло, метод ПолучитьСобытия возвращает пустой массив. Если Таймаут не указан, ожидание происходит неограниченно долго, пока не будет зарегистрировано событие, удовлетворяющее настройкам поиска.
Пример ниже демонстрирует использование экземпляра МониторФайловойСистемы для отслеживания и обработки изменений в двух каталогах. Для первого каталога отслеживаются все файлы и все типы изменений, для второго — только удаление текстовых файлов.
пер Каталог1 = новый Файл("C:\\Directory1")
пер Каталог2 = новый Файл("C:\\Directory2")
исп Монитор = новый МониторФайловойСистемы()
// Создайте методы для изначальной обработки 
// имеющихся в каталоге файлов и подкаталогов
// ОбработатьВесьКаталог(Каталог1)
// ОбработатьВесьКаталог(Каталог2)
Монитор.Отслеживать(Каталог1)
Монитор.Отслеживать(Каталог2,
        ВидыСобытий = ВидСобытияФайловойСистемы.Удаление,
        ИменаФайлов = "*.txt")
пока Истина
    // Ожидание новых событий
    пер МассивСобытий = Монитор.ПолучитьСобытия() 
    для Событие из МассивСобытий
        если Событие.ВидСобытия == ВидСобытияФайловойСистемы.Создание
            // Создайте метод для обработки событий создания файлов.
            // Используйте свойство "Событие.Файл", чтобы получить
            // информацию о созданном файле
            // ОбработатьСоздание(Событие)
        ;
        если Событие.ВидСобытия == ВидСобытияФайловойСистемы.Удаление
            // Создайте метод для обработки событий удаления файлов.
            // Используйте свойство "Событие.Файл", чтобы получить
            // информацию об удалённом файле
            // ОбработатьУдаление(Событие)
        ;
         если Событие.ВидСобытия == ВидСобытияФайловойСистемы.ПотеряСобытий
            // Заново обработайте весь каталог при потере событий
            // ОбработатьВесьКаталог(Событие.Файл)
        ;
    ;
;