Работа с файлами и каталогами
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
См. также: