Работа с файлами и каталогами
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
Возвращает размер указанного файла (число двойной длины). Для того, чтобы узнать суммарный размер файлов, хранящихся в каталоге, используйте слово 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: модификатор 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
Возвращает флаг TRUE (-1), если файл пуст или физически отсутствует.
Возвращает флаг TRUE (-1), если указанный файл или каталог существует.
Существует также постфиксный вариант этого слова:
S" file_pattern" EXIST?
Создает новый пустой файл с указанным именем. Если это необходимо, создает все промежуточные подкаталоги. Если же нужно создать не файл, а каталог, воспользуйтесь словом 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
Записывает аргумент 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
Создает указанный каталог и все промежуточные подкаталоги, если это необходимо.
Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.
Удаляет указанный каталог или дерево каталогов.
Будьте внимательны, заданный каталог или дерево каталогов будут удалены, даже
если они не пусты.
Пример:
DIR-DELETE: "c:\xxx"
Если в процессе работы ключевого слова произошла ошибка, то ее номер можно узнать с помощью слова GetLastError.
Возвращает суммарный размер файлов, хранящихся в каталоге (число двойной длины).
Пример:
#( 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
Возвращает TRUE если указанный каталог пуст и FALSE если
в нем есть хоть один файл или подкаталог.
Будьте внимательны, DIR-EMPTY: возвpащает TRUE и в случае
если указанный в качестве аргумента каталог не существует.
Получает в качестве аргумента строку с путем и именем файла (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
Получает в качестве аргумента строку с путем и именем файла (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 | - просмотр дерева каталогов в глубину
Дерево каталогов можно просматривать двумя способами: |
| 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
См. также:
![]()