Плагин time.spf

Файл: time.spf
Автор: Nicholas Nemtsev
Описание: Плагин позволяет отслеживать время создания (последнего доступа, последней записи) файла с точностью до секунды. Кроме этого, предоставляется возможность отслеживать изменения файлов по маске и составлять список измененных файлов.

Новые слова:


FILE-TIME: "filename"
FILE-ATIME: "filename"
FILE-WTIME: "filename"

Определяет время создания/время последнего доступа/время последней записи в указанный файл. Возвращает дату в формате FILETIME.

Примеры:

#( test_file_time1
\ если файл '1.sem' создан раньше, чем файл '2.sem',
\ производим какие-то полезные действия
Action:
FILE-TIME: "C:\1.sem" FILE-TIME: "C:\2.sem" FTIME- 0>
IF
    \ ... производим работу
THEN
)#

Существует постфиксные варианты этих слов:

S" c:\temp\test.txt" FILE-TIME
S" c:\temp\test.txt" FILE-ATIME
S" c:\temp\test.txt" FILE-WTIME

Дополнительные способы работы с датами и приемы преобразования дат подробно описаны в соответствующей главе.


FTIME-

Используется для сравнения времени создания (последнего доступа, последней записи) двух файлов, а также для сравнения времени создания (последнего доступа и последней записи) с текущим временем.
Возвращает разницу (в секундах) между двумя датами в формате FILE-TIME.

Примеры:

\ файл test.txt был создан более 10 минут назад
FT-CUR FILE-TIME: "test.txt" FTIME- 600 >

Дополнительные способы работы с датами и приемы преобразования дат подробно описаны в соответствующей главе.


FILE-CHANGE: "file_mask"

При первом использовании FILE-CHANGE: составляет (по маске) список файлов, учитывая время последнего изменения, а затем, при последующих использованиях, сравнивает список с самими файлами и возвращает TRUE если один или несколько файлов изменились. Если с файлами ничего не произошло, то FILE-CHANGE: возвращает FALSE.
Список отслеживаемых файлов сохраняется в домашнем каталоге nnCron под именем etc\filechange.txt. Удаленные файлы не учитываются, т. е. не считаются измененными.
Перед словом FILE-CHANGE: можно использовать модификатор RECURSIVE.

Не забывайте, что слово FILE-CHANGE: возвращает флаг. Это означает, что FILE-CHANGE: нужно иcпользовать совместно с конструкцией IF ELSE THEN или явным образом удалять со стека возвращенное FILE-CHANGE: значение.

Примеры:

#( test_file_time3
\ раз в 10 минут отслеживаем изменения всех текстовых файлов в
\ каталоге 'c:\xxx'. Выводим сообщение при обнаружении изменений
Time: */10
Action:
FILE-CHANGE: "c:\XXX\*.txt"
IF
    TMSG: "Files were changed!" 5
THEN
)#

#( test_file_time_3_recursive
\ раз в 10 минут отслеживаем изменения всех текстовых файлов в
\ каталоге 'c:\xxx' и его подкаталогах.
\ Выводим сообщение при обнаружении изменений
Time: */10
Action:
RECURSIVE
FILE-CHANGE: "c:\XXX\*.txt"
IF
    TMSG: "Files were changed!" 5
THEN
)#

FCH-CH-LIST

Cписок измененных файлов, который формируется после работы FILE-CHANGE:.

Примеры:

#( test_file_time4
\ раз в 10 минут отслеживаем изменения всех текстовых файлов в
\ каталоге 'c:\xxx'. Выводим сообщение при обнаружении изменений.
\ Список измененных файлов выводим на консоль
: type-node NodeValue ASCIIZ> TYPE CR ;
Time: */10
Action:
FILE-CHANGE: "c:\XXX\*.txt"
IF
    TMSG: "Files were changed" 5
    ['] type-node FCH-CH-LIST DoList
THEN
)#

#( test_file_time5
\ раз в 10 минут отслеживаем изменения всех текстовых файлов в
\ каталоге 'c:\xxx'. Список измененных файлов сохранияем в файл
\ 'log\list.log' и выводим список в сообщении
: log-list NodeValue ASCIIZ> S" log\list.log" LOG ;
Time: */10
Action:
FILE-CHANGE: "c:\XXX\*.txt"
IF
    ['] log-list FCH-CH-LIST DoList
    TMSG: "Changed files:%crlf%%FILE: log\list.log%" 10
    FILE-DELETE: "log\list.log"
THEN
)#

#( test_file_time6
\ раз в 10 минут отслеживаем изменения всех текстовых файлов в
\ каталоге 'c:\xxx'. Имя каждого измененного файла передаем в 
\ качестве параметра программе 'notepad.exe'
: write-files NodeValue ASCIIZ> S" c:\changed_files.log" FAPPEND
  crlf S" c:\changed_files.log" FAPPEND
;
VARIABLE list-file
CREATE list-contents 258 ALLOT
Time: */10
Action:
FILE-CHANGE: "c:\XXX\*.txt"
IF
    \ writing the list of all the changed files
    ['] write-files FCH-CH-LIST DoList
    \ reading the list one line at a time
    S" c:\changed_files.log" R/O OPEN-FILE-SHARED THROW list-file !
    BEGIN list-contents 1+ 255 list-file @ READ-LINE THROW WHILE
        list-contents C!
        \ processing each line: passing each filename as 
        \ command line parameter
        START-APP: notepad.exe %list-contents COUNT%
    REPEAT
    DROP
    list-file @ CLOSE-FILE DROP
    FILE-DELETE: "c:\changed_files.log"
THEN
)#

UPTIME ( -- sec)

Кладет на стек количество секунд, прошедших с момента старта операционной системы.

Пример:

\ задача запустится, если с момента старта 
\ операционной системы прошло меньше 90 секунд
Rule: UPTIME 90 <