Работа с файлами и каталогами



FILE-COPY: "from_filename" "to_filename"

Копирует указанный файл. Перезаписывает файл в приемном каталоге, если файл с указанным именем там уже существует и он не занят другим приложением. Если вы не изменяете имя файла в процессе копирования, то в качестве аргумента to_filename можно указывать приемный каталог без имени файла.
Не поддерживает работу с масками имен файлов и не работает с каталогами. Для обработки нескольких файлов используйте цикл FOR-FILES:.

Примеры:

FILE-COPY: "c:\xxx\test.txt" "c:\xxx\new.txt"
FILE-COPY: "c:\xxx\test.txt" "d:\backup\another_test.txt" 
\ копируем файл test.txt в каталог c:\yyy\
FILE-COPY: "c:\xxx\test.txt" "c:\yyy\"
\ копируем файл test.txt в файл backup
FILE-COPY: "c:\xxx\test.txt" "c:\backup"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" from_filename" S" to_filename" FCOPY

FILE-MOVE: "from_filename" "to_filename"

Перемещает указанный файл. Если вы не изменяете имя файла в процессе перемещения, то в качестве аргумента to_filename можно указывать приемный каталог без имени файла.
Не поддерживает работу с масками имен файлов и не работает с каталогами. Для обработки нескольких файлов используйте цикл FOR-FILES:.

Примеры:

FILE-MOVE: "c:\xxx\test.txt" "c:\xxx\new.txt"
FILE-MOVE: "c:\xxx\test.txt" "d:\backup\test.txt"
\ перемещаем файл test.txt в каталог c:\yyy\
FILE-MOVE: "c:\xxx\test.txt" "c:\yyy\"
\ перемещаем файл test.txt в файл backup
FILE-MOVE: "c:\xxx\test.txt" "c:\backup"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" from_filename" S" to_filename" FMOVE

FILE-RENAME: "old_filename" "new_filename"

Переименовывает указанный файл. Если вы просто перемещаете файл, а не изменяете его имя, то в качестве аргумента to_filename можно указывать приемный каталог без имени файла.
В отличии от слова FILE-MOVE: может переименовывать (перемещать) каталоги, но только в пределах одного диска..

Примеры:

FILE-RENAME: "c:\xxx\test.txt" "c:\xxx\new.txt"
FILE-RENAME: "c:\xxx" "c:\yyy" \ только в пределах одного диска 
\ перемещаем файл test.txt в каталог c:\yyy\
FILE-RENAME: "c:\xxx\test.txt" "c:\yyy\"
\ переименовываем файл test.txt в файл backup
FILE-RENAME: "c:\xxx\test.txt" "c:\backup"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" old_filename" S" new_filename" FRENAME

FILE-SIZE: "file_pattern"

Возвращает размер указанного файла (число двойной длины). Для того, чтобы узнать суммарный размер файлов, хранящихся в каталоге, используйте слово DIR-SIZE:.

Примеры:

\ проверяем размер файла и выдаем сообщение
10240. FILE-SIZE: "c:\test.txt" D<
IF MSG: "File size exceeds 10kb"
ELSE MSG: "File size less then 10kb"
THEN
#( test_file_size
\ действие выполнится, если размер файла больше 10 kb
Rule: 10240. FILE-SIZE: "c:\test.txt" D<
Action:
    \ ... выполняем работу
)# 

#( test_file_size1
\ выводим сообщение, если размер указанного файла
\ превышает 100kb
NoActive
Action:
    102400. FILE-SIZE: "c:\fido\sessions.log" D<
    IF
        MSG: "File size exceeds 100 kb!"
    THEN
)#

#( test_delete_empty
\ рекурсивно удаляем в указанном каталоге
\ все файлы нулевого размера NoActive
 Action:
     RECURSIVE
     FOR-FILES: "c:\xxx\*.*"
         0. FILE-SIZE: "%FOUND-FULLPATH%" D=
         IF FILE-DELETE: "%FOUND-FULLPATH%" THEN
     ;FOR-FILES
)#

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

S" filename" FSIZE


FILE-DELETE: "filename"

Удаляет указанный файл. Поддерживает работу с масками имен файлов. Для того, чтобы удалить файлы, подходящие по маске не только в текущем каталоге, но и во всех его подкаталогах, используйте перед словом FILE-DELETE: модификатор RECURSIVE.

Слово FILE-DELETE: не работает с каталогами. При необходимости удалить не файл, а каталог, воспользуйтесь словом DIR-DELETE.

Пример:

FILE-DELETE: "c:\xxx\test.txt"
FILE-DELETE: "c:\xxx\*.txt"
RECURSIVE FILE-DELETE: "c:\xxx\*.txt"

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

S" filename" FDELETE

Cо словом FILE-DELETE: не имеет смысла использовать стандартный способ получения кода ошибки (GetLastError), поскольку FILE-DELETE: работает с масками и всегда возвращает ошибку №18 (There are no more files. ERROR_NO_MORE_FILES).

Впрочем, если хочется получать код ошибки после удаления файла, можно пользоваться стандартным словом Форт DELETE-FILE ( c-addr u -- ior )

Пример:

S" myfile.txt" DELETE-FILE ?DUP IF ." Error # " . CR THEN

FILE-EMPTY: "file_pattern"

Возвращает флаг TRUE (-1), если файл пуст или физически отсутствует.


FILE-EXIST: "file_pattern"

Возвращает флаг TRUE (-1), если указанный файл или каталог существует.

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

S" file_pattern" EXIST?


FILE-CREATE: "filename"

Создает новый пустой файл с указанным именем. Если это необходимо, создает все промежуточные подкаталоги. Если же нужно создать не файл, а каталог, воспользуйтесь словом DIR-CREATE:.

Примеры:

\ создает пустой файл 'test.txt' в корне диска 'c:'
FILE-CREATE: "c:\test.txt"
\ создает пустой файл 'test.txt' в каталоге 'c:\xxx\yyy\zzz'
\ при этом несуществующие промежуточные каталоги будут созданы
FILE-CREATE: "c:\xxx\yyy\zzz\test.txt" 

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" filename" FCREATE

FILE-WRITE: "filename" "text"

Записывает аргумент text в указанный файл. Старое содержимое файла при этом удаляется.

В аргументах FILE-WRITE: можно использовать пользовательские переменные и предопределенные переменные nnCron. Чтобы записать в файл знак кавычек или знак процента используйте, соответственно, переменные %QUOTE% и %PERCENT%. Используя переменную %FILE: filename%, можно записать в файл содержимое другого файла.

Примеры:

FILE-WRITE: "c:\xxx\test.txt" "Last update: %hh%:%mm%"
FILE-WRITE: "c:\xxx\test.txt" "%USERNAME% was there!" 
FILE-WRITE: "c:\xxx\test.txt"
"Содержимое другого файла:%crlf%%crlf%%FILE: c:\yyy\source.txt%"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" text" S" filename" FWRITE


FILE-APPEND: "filename" "text"

Работает аналогично слову FILE-WRITE:, но не замещает старое содержимое, а дописывает новую информацию в конец файла.

Примеры:

FILE-APPEND: "c:\xxx\test.txt" 
"Message was sent at: %hh%:%mm%%crlf%"
FILE-APPEND: "c:\xxx\test.txt" 
"Содержимое другого файла:%crlf%%FILE: c:\yyy\source.txt%"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.

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

S" text" S" filename" FAPPEND


DIR-CREATE: "path"

Создает указанный каталог и все промежуточные подкаталоги, если это необходимо.

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.


DIR-DELETE: "path"

Удаляет указанный каталог или дерево каталогов.
Будьте внимательны, заданный каталог или дерево каталогов будут удалены, даже если они не пусты.

Пример:

DIR-DELETE: "c:\xxx"

Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.


DIR-SIZE: "path"

Возвращает суммарный размер файлов, хранящихся в каталоге (число двойной длины).

Пример:

#( test_dir_size
\ выводим сообщение, если суммарный размер 
\ файлов в каталоге 'c:\cpp' превышает 100kb 
\ (не учитывая вложенные подкаталоги)
NoActive
Action:
    102400. DIR-SIZE: "c:\cpp" D<
    IF
        MSG: "Dir size exceeds 100 kb!"
    THEN
)#

Для того, чтобы узнать размер каталога со всеми вложенными подкаталогами, используйте перед DIR-SIZE: модификатор RECURSIVE.

Пример:

#( test_dir_size1
\ выводим сообщение, если суммарный размер 
\ файлов в каталоге 'c:cpp' превышает 100kb 
\ (учитывая файлы во всех вложенных подкаталогах) 
NoActive
Action:
    102400. RECURSIVE DIR-SIZE: "c:\cpp" D<
    IF
        MSG: "Dir size exceeds 100 kb!"
    THEN
)#

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

S" dirname" DIR-SIZE


DIR-EMPTY: "path"

Возвращает TRUE если указанный каталог пуст и FALSE если в нем есть хоть один файл или подкаталог.
Будьте внимательны, DIR-EMPTY: возвpащает TRUE и в случае если указанный в качестве аргумента каталог не существует.


ONLYDIR

Получает в качестве аргумента строку с путем и именем файла (S" fullpath" ONLYDIR) и возвращает строку, содержащую только путь (без имени файла). Например, получив строку 'd:\tools\nnbackup\nnbackup.exe', слово ONLYDIR вернет строку 'd:\tools\nnbackup'.

Обратите внимание: это слово можно использовать при составлении задачи, но нельзя использовать в консоли!

Пример:

#( test_filename
NoActive
Action:
    FILESONLY 
    FOR-FILES: "C:\TEMP\*"
        MSG: "Full filename: %FOUND-FULLPATH%%crlf%\
Path only: %FOUND-FULLPATH ONLYDIR%"
;FOR-FILES )#

См. также: ONLYNAME


ONLYNAME

Получает в качестве аргумента строку с путем и именем файла (S" fullpath" ONLYNAME) и возвращает строку с именем файла (без пути). Например, получив строку 'd:\tools\nnbackup\nnbackup.exe', слово ONLYNAME вернет 'nnbackup.exe'.

Обратите внимание: это слово можно использовать при составлении задачи, но нельзя использовать в консоли!

Пример:

#( test_filename1
NoActive
Action:
    FILESONLY 
    FOR-FILES: "C:\TEMP\*"
        MSG: "Full filename: %FOUND-FULLPATH%%crlf%\
Name only: %FOUND-FULLPATH ONLYNAME%"
;FOR-FILES )#

См. также: ONLYDIR


FOR-FILES: "path\mask" <...> ;FOR-FILES

Специальный цикл, который позволяет обрабатывать не только одиночные файлы, но и целые группы файлов и каталогов, подпавших под указанную маску: для каждого такого файла или каталога будут выполнены команды, заданные в теле цикла FOR-FILES:.

Пример:

#( test_for_files
\ удаляем все файлы с расширением '*.txt' в каталоге 'c:\xxx'
NoActive
Action:
    FOR-FILES: "c:\xxx\*.txt"
        FILE-DELETE: "%FOUND-FULLPATH%"
    ;FOR-FILES
)#

Работает это примерно так: если, например, под определенную маску подпали пять файлов, то цикл FOR-FILES: автоматически будет запущен пять раз, причем при каждом запуске будет обновлено значение следующих переменных:

%FOUND-FILENAME% имя файла, подпавшего под маску (например, test.txt)
%FOUND-FULLPATH% полное имя файла, подпавшего под маску (например, c:\xxx\yyy\test.txt)
%FOUND-RELPATH% полное имя файла, подпавшего под маску, относительно каталога поиска (например, yyy\test.txt)

Значит, при каждом цикле вы получаете доступ к имени очередного файла, подпадающего под указанную маску. Вам остается только выполнить над этим файлом нужное действие (удалить, переместить, переименовать и т. д.) или же предпринять новую проверку, чтобы решить, как именно поступить с конкретным файлом.

Вот какие проверки можно произвести в теле цикла FOR-FILES: (используйте слово 0=, чтобы обратить условие):

IS-DIR? Возвращает TRUE, если найден каталог
IS-HIDDEN? Возвращает TRUE, если найден файл/каталог с атрибутом hidden
IS-READONLY? Возвращает TRUE, если найден файл/каталог с атрибутом read-only
IS-SYSTEM?
Возвращает TRUE, если найден файл/каталог с атрибутом system
IS-ARCHIVE? Возвращает TRUE, если найден файл/каталог с атрибутом archive

Пример:

\ под эту маску попадают все файлы и подкаталоги 
\ в директории 'c:\xxx', но благодяря дополнительным 
\ проверкам мы обработаем только все подкаталоги 
\ и все файлы с атрибутами 'hidden' и 'read-only'
FOR-FILES: "c:\xxx\*"
    \ проверяем, является ли найденный файл каталогом?
    IS-DIR?
    IF
        \ ... команды для работы с каталогами, в том числе 
        \ и с атрибутами 'hidden' и 'read-only'
    ELSE
\ проверяем, имеет ли найденный файл атрибут 'hidden'? IS-HIDDEN? IF \ ... команды для работы со скрытыми файлами ELSE \ проверяем, имеет ли найденный файл \ атрибут 'read-only'? IS-READONLY? IF \ ... команды для работы с файлами, \ доступными только для чтения THEN THEN THEN ;FOR-FILES

Кроме этого, в теле цикла FOR-FILES: можно работать с датой создания, изменения и последнего доступа к файлу (см. также главу "Работа с датами и временем"):

CREATION-DATE дата создания найденного файла
ACCESS-DATE дата доступа
WRITE-DATE дата записи
CUR-DATE системная дата
DATE- разность двух дат ( date1-date2 ). Возвращает разницу в днях между двумя датами.

Пример:

#( test_for_files1
\ удаляем в каталоге 'c:\xxx' все файлы,
\ созданные больше десяти дней назад 
NoActive
Action:
    FOR-FILES: "c:\xxx\*"
        \ работаем только с файлами, каталоги пропускаем
        IS-DIR? 0=
IF CUR-DATE CREATION-DATE DATE- 10 > IF FILE-DELETE: "%FOUND-FULLPATH%" THEN THEN ;FOR-FILES )#

Перед циклом FOR-FILES: можно использовать следующие модификаторы:

RECURSIVE

- работаем с указанным каталогом и всеми его подкаталогами
TODEPTH - просмотр дерева каталогов в глубину

Дерево каталогов можно просматривать двумя способами:
1. Вначале обработать текущий каталог, затем все подкаталоги
(этот способ используется по умолчанию).
2. Просмотреть все подкаталоги, а затем текущий каталог.

FILESONLY

- выполнять тело цикла только для файлов, не трогая каталоги

SKIPERRORS

- игнорировать ошибки доступа при "обходе" дерева каталогов

Примеры:

#( test_for_files2
\ удалаяем все файлы и подкаталоги в директории 'c:\xxx'.
\ Файлы удаляем с помощью слова 'FILE-DELETE',
\ а каталоги - с помощью слова 'DIR-DELETE:'
NoActive
Action:
    RECURSIVE
    FOR-FILES: "c:\xxx\*"
        \ проверяем, является ли найденный файл каталогом?
        IS-DIR?
        IF
            DIR-DELETE: "%FOUND-FULLPATH%"
        ELSE 
            FILE-DELETE: "%FOUND-FULLPATH%"
        THEN
    ;FOR-FILES
)#
#( test_for_files3 \ удаляем все файлы нулевой длины из каталога 'c:\zzz' и всех его \ подкаталогов. Работаем только с файлами, директории не удаляем. NoActive Action: RECURSIVE FILESONLY FOR-FILES: "c:\zzz\*.*" FILE-SIZE: "%FOUND-FULLPATH%" D0= IF FILE-DELETE: "%FOUND-FULLPATH%" THEN ;FOR-FILES )#

При необходимости из цикла FOR-FILES: можно в любой момент выйти принудительно с помощью слова FF-EXIT

Пример:

#( test_for_files4
\ выводим в сообщении имена всех обнаруженных 
\ текстовых файлов в каталоге C:\TEMP\
\ прекращаем цикл при обнаружении файла exit.txt
NoActive
Action:
    FOR-FILES: "C:\TEMP\*.txt"
        MSG: "%FOUND-FILENAME%"
        \ проверяем имя каждого найденного файла с именем exit.txt
        RE-MATCH: "%FOUND-FILENAME%" "/exit.txt/i"
        \ если имя совпало - выходим из цикла
        IF FF-EXIT THEN
    ;FOR-FILES
    BEEP: 250 500
)#

FILE-CROP: "filename" <max_size> <size_after_crop>

Позволяет котролировать размер текстовых файлов. Удаляет начало указанного файла с таким расчетом, чтобы его размер был не больше значения аргумента size_after_crop. Файл "обрезается" только в том случае, если размер файла превышает значение аргумента max_size.

Аргументы max_size и size_after_crop задаются в килобайтах.

Основная сфера применения этого ключевого слова - контроль за размером лог-файлов.

Пример:

\ лог-файл 'sessions.log' будет "обрезан" до размера 
\ в 500 килобайт, если в момент вызова слова 
\ 'FILE-CROP:' его размер уже превышал 1 мегабайт
FILE-CROP: "c:\fido\sessions.log" 1000 500
\ лог-файл 'nncron.log' будет "обрезан" до размера 
\ в 50 килобайт, если в момент вызова слова '
\ FILE-CROP:'  его размер уже превышал 100 килобайт
FILE-CROP: "log\nncron.log" 100 50

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

S" filename" <max_size> <size_after_crop> FCROPkb


PURGE-OLD: "path\mask" <days>
PURGE-OLDW: "path\mask" <days>
PURGE-OLDA: "path\mask" <days>

Удаляет все файлы, подпадающие под маску, старше указанного количества дней. При этом PURGE-OLD: работает с датой создания файла, PURGE-OLDW: - с датой последней записи в файл, а PURGE-OLDA: - с датой последнего доступа к файлу.

Используйте модификатор RECURSIVE, чтобы удалить файлы в указанном каталоге и всех его подкаталогах.

Если использовать -1 в качестве значения days, то в указанном каталоге будут удалены все файлы.

Примеры:

\ удаляем из временного каталога Windows все файлы старше трех дней
PURGE-OLD: "c:\windows\temp\*" 3
\ удаляем из указанного каталога и всех его подкаталогов текcтовые 
\ файлы, чья дата последней записи превышает десять дней
RECURSIVE
PURGE-OLDW: "c:\drafts\*.txt" 10
\ удаляем все файлы из временного каталога Windows
PURGE-OLD: "c:\windows\temp\*" -1

По умолчанию, слова PURGE-OLD*: удаляют только файлы, но, воспользовавшись модификатором WITHDIRS, вы можете удалять и файлы и каталоги, старше указанного количества дней. Будьте внимательны - каталоги, старше указанного времени удаляются вместе со всем их содержимым!

Пример:

\ удаляем ВСЕ файлы и каталоги
WITHDIRS 
PURGE-OLD: "c:\windows\temp\*" -1

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

S" c:\temp\*.txt" -1 PURGE-OLD
S" c:\temp\*" 10 PURGE-OLDW
WITHDIRS S" c:\temp\test\*.bat" 5 PURGE-OLDA

FILE-CREATION-DATE: "path" (можно также пользоваться словом FILE-DATE: "path")
FILE-ACCESS-DATE: "path"
FILE-WRITE-DATE: "path"

Возвращает (соответственно) дату создания, последнего доступа и записи в указанный файл в формате DATE. С помощью этих слов можно работать с датами создания, последней записи с последнего доступа к файлу.

Текущее системное время можно положить на стек с помощью слова CUR-DATE. Слово DATE- возвращает разницу в днях между двумя датами. Способы работы с датами и приемы преобразования дат подробно описаны в соответствующей главе.

Примеры:

#( test_file_date
\ удаляем файл 'new.txt' если он был создан более 30 дней назад 
NoActive
Action:
    CUR-DATE
    FILE-CREATION-DATE: "c:\xxx\new.txt"
    DATE- 30 > 
    IF
        FILE-DELETE: "c:\xxx\new.txt"
    THEN
)# 

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

S" filename" FCDATE
S" filename" FADATE
S" filename" FWDATE

См. также: