EnglishРусский  

   hello

   square

   easymath

   fileattrib

   runini

   easyhtml

   calendar

   samefiles

   Продолжение следует

Реклама

Инсталлятор CreateInstall
Бесплатные и коммерческие инсталляторы

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 )

Исходники

Редактировать