fileattrib
В этом уроке мы поработаем с файлами.
Пример 1
Необходимо у файлов установить или снять атрибут только чтение. Должна присутствовать возможность указания параметров в командной строке. Файлы могут быть определены в виде маски с использованием '*' и '?'. '*' - определяет любую последовательность символов, '?' - любой символ.Так
c:\temp\*.* - все файлы в директории c:\temp
c:\temp\*.exe - все файлы с расширением exe в директории c:\temp
c:\temp\a*.* - все файлы начинающиеся с 'а' в директории c:\temp
Начнем с разбора командной строки. Здесь нет ничего сложного, так как имеется две функции: argc - получить количество аргументов, argv - получить конкретный параметр. Первым параметром должно быть слово on или off для установки или снятия атрибута и вторым параметром маска для обрабатываемых файлов. Вот что у нас вышло.
if argc() > 1
{
if argv( temp, 1 ) %== "on" : mode = 1
elif argv( temp, 1 ) %== "off" : mode = 2
argv( path, 2 )
}
Оператор '%==' производит сравнение строк без учета регистра. В этом случае вы можете писать и ON и Off.
Если параметры не были указаны при запуске программы или были указаны неверно, то надо дать возможность ввести необходимую информацию в консоли.
if !mode
{
mode = conrequest( "Choose an action (press a number key):
1. Turn on readonly attribute
2. Turn off readonly attribute
3. Exit\n", "1|2|3" ) + 1
if mode == 3 : return
congetstr( "Specify a filename or a wildcard: ", path )
}
Здесь предлагается ввести 1 для установки атрибута, 2 для его снятия и 3 для выхода из программы. Функция conrequest ожидает от пользователя нажатия клавиши и возвращает номер выбранного варианта с 0.
Например,
conrequest("Press #'Y#' or #'N#'", "Yy|Nn" )
Сейчас можно приступить непосредственно к реализации задания. Для поиска файлов существует структура ffind. Опишем переменную fd типа ffind и инициализируем ее.
fd.init( path, $FIND_FILE | $FIND_RECURSE )
$FIND_FILE - указывает на то, что ищем файлы$FIND_RECURSE - будем искать файлы во всех поддиректориях.
Например,
fd.init( "c:\\temp.txt", $FIND_FILE | $FIND_RECURSE )
с указанным флагом $FIND_RECURSE будет искать файл temp.txt на всем диске C:.
Для перебора файлов используем оператор foreach
foreach cur,fd
{
attrib = getfileattrib( cur.fullname )
if mode == 1 : attrib |= $FILE_ATTRIBUTE_READONLY
else : attrib &= ~$FILE_ATTRIBUTE_READONLY
setfileattrib( cur.fullname, attrib )
print( "\(cur.fullname)\n" )
}
finfo - тип хранящий информацию о файле. Его описание можно найти в помощи.
cur - переменная данного типа в которой будет хранится информация об очередном найденном файле.
То, что находится внутри цикла прокомментирую вкратце. Получаем текущие атрибуты файла
attrib = getfileattrib( cur.fullname )
В зависимости от режима устанавливаем или сбрасываем атрибут только чтение. Все остальные атрибуты сохраняются.
if mode == 1 : attrib |= $FILE_ATTRIBUTE_READONLY
else : attrib &= ~$FILE_ATTRIBUTE_READONLY
Записываем измененные атрибуты файла
setfileattrib( cur.fullname, attrib )