Понедельник, 18.12.2017, 17:43Приветствую Вас Гость | RSS
Программирование на языке Turbo Pascal
Меню сайта
Категории раздела
/
Наш опрос
Оцените мой сайт
Всего ответов: 146
Статистика
счетчик посещений TOPIZ.RU
Форма входа

ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ


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

Процедура Close. Закрывает файл, однако связь файловой переменной с именем файла, установленная ранее процедурой ASSIGN, сохраняется. Формат обращения:

CLOSE (<ф.п.>)

При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры CLOSE выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры ASSIGN.

Процедура RENAME. Переименовывает файл. Формат обращения:

RENAME (<ф.п.>, <новое имя>)

Здесь <новое имя> - строковое выражение, содержащее новое имя файла. Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

Процедура ERASE. Уничтожает-файл. Формат обращения:

ERASE (<ф.п.>)

Перед выполнением процедуры необходимо закрыть файл, если он ранее был открыт процедурами RESET, REWRITE или APPEND.

Следующий фрагмент программы показывает, как можно использовать процедуры RENAME и CLOSE при работе с файлами. Предположим, что требуется отредактировать файл, имя которого содержит переменная NAME. Перед редактированием необходимо убедиться, что нужный файл имеется на диске, и переименовать его - заменить расширение этого файла на ВАК (страховочная копия). Если файл с таким расширением уже существует, его надо стереть.

var

fi : text; {Исходный файл}

fo : text; {Отредактированный файл}

name : String;

name_bak: String;

k, i: Word;

const

bak = '.bak';

begin

.......

{Получаем в name bak имя файла с расширением .ВАК:}

k := pos('.',name);

if k = 0 then

k := length(name) +1;

name_bak := copy(name,1,k-1) + bak;

{Проверяем существование исходного файла:}

assign(fi,name);

{$I-} ' reset(fi);

if lOResult <> 0 then

halt; {Завершаем программу: файла не существует}

close(fi); ,

{Проверяем существование .ВАК-файла:}

assign(fо,name_bak);

reset (fo);

{$I+}

if lOResult = 0 then

begin {Файл .ВАК существует:}

close(fo); {Закрываем его}

erase(fo) {и уничтожаем}

end;

{Проверки закончены, подготовка к работе:}

rename(f i,name_bak);

reset(fi);

assign(fo,name);

rewrite(fo);

.......

end.

Обратите внимание: проверка на существование файла .ВАК в данном примере необходима, так как обращение

rename(fi,name_bak);

вызовет ошибку в случае, если такой файл существует.

Процедура FLUSH. Очищает внутренний буфер файла и, таким образом, гарантирует сохранность всех последних изменений файла на диске. Формат обращения:

FLUSH (<ф.п.>)

Любое обращение к файлу в Турбо Паскале осуществляется через некоторый буфер, что необходимо для согласования внутреннего представления файлового компонента (записи) с принятым в ДОС форматом хранения данных на диске. В ходе выполнения процедуры FLUSH все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициирован для чтения процедурой RESET.

Функция EOF (<ф. п. >) : BOOLEAN. Логическая функция, тестирующая конец файла. Возвращает TRUE, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении -что файл исчерпан.

Процедура CHDIR. Изменение текущего каталога. Формат обращения:

CHDIR (<путь>)

Здесь <путь> - строковое выражение, содержащее путь к устанавливаемому по умолчанию каталогу.

Процедура GETDIR. Позволяет определить имя текущего каталога (каталога по умолчанию). Формат обращения:

GETDIR (<устройство>, <каталог>)

Здесь <устройство> - выражение типа WORD , содержащее номер устройства: 0 - устройство по умолчанию, 1 - диск А, 2 - диск В и т.д.;

<каталог> - переменная типа STRING, в которой возвращается путь к текущему каталогу на указанном диске.

Процедура MKDIR. Создает новый каталог на указанном диске. Формат обращения:

MKDIR (<каталог>)

Здесь <каталог> - выражение типа STRING, задающее путь к каталогу. Последним именем в пути, т.е. именем вновь создаваемого каталога не может быть имя уже существующего каталога.^

Процедура RMDIR. Удаляет каталог. Формат обращения:

RMDIR (<каталог>)

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

Функция IORESULT: WORD. Возвращает условный признак последней операции ввода-вывода.

Если операция завершилась успешно, функция возвращает ноль. Коды ошибочных операций ввода-вывода представлены в прил.З. Следует помнить, что IORESULT становится доступной только при отключенном автоконтроле ошибок ввода-вывода. Директива компилятора {$I-} отключает, а директива {$I+} включает автоконтроль. Если автоконтроль отключен, а операция ввода-вывода привела к возникновению ошибки, устанавливается флаг ошибки и все последующие обращения к вводу-выводу блокируются, пока не будет вызвана функция IORESULT.

Ряд полезных файловых процедур и функций становится доступным при использовании библиотечного модуля DOS.TPU, входящего в стандартную библиотеку TURBO. TPL . Эти процедуры и функции указаны ниже. Доступ к ним возможен только после объявления USES DOS в начале программы (подробнее о работе с модулями см. гл.9).

Функция DISKFREE (<диск>) : LONGINT. Возвращает объем в байтах свободного пространства на указанном диске. При обращении к функции выражение <диск> типа BYTE определяет номер диска: 0 - устройство по умолчанию, 1 - диск А , 2 - диск В и т.д. Функция возвращает значение -1, если указан номер несуществующего диска.

Функция DISKSIZE (<диск>) : LONGINT. Возвращает полный объем диска в байтах или -1 , если указан номер несуществующего диска.

Процедура FINDFIRST. Возвращает атрибуты первого из файлов, зарегистрированных в указанном каталоге. Формат обращения:

FINDFIRST (<маска>, <атрибуты>, <имя>)

Здесь <маска> - строковое выражение, содержащее маску файла;

<атрибуты> - выражение типа BYTE, содержащее уточнение к маске (атрибуты); <имя> - переменная типа SEARCHREC, в которой будет возвращено имя файла.

При формировании маски файла используются следующие символы-заменители ДОС:

* означает, что на месте этого символа может стоять сколько угодно (в том числе ноль) разрешенных символов имени или расширения файла;

? означает, что на месте этого символа может стоять один из разрешенных символов.

Например:

* . * выбирает все файлы из каталога;

с* . * выбирает все файлы с именами, начинающимися на с (cl.pas,сс!2345, c.dat и т.д.);

a?.dat выбирает имена файлов типа a0.dat, az.dat и т.д.

Маске может предшествовать путь'. Например, команда

с:\dir\subdir\*.pas

эзначает выбирать все файлы с расширением .PAS из каталога SUBDIR, находящегося на диске С; каталог SUBDIR зарегистрирован в каталоге верхнего уровня DIR, который, в свою очередь, входит в корневой каталог.

Байт <атрибуты> содержит двоичные разряды (биты), уточняющие, к каким именно файлам разрешен доступ при обращении к процедуре FINDFIRST . Вот как объявляются файловые атрибуты в модуле DOS. TPU:

const

Readonly = $01; {только чтение}

Hidden = $02; {скрытый файл}

SysFile = $04; {системный файл}

VolumeID = $08; {идентификатор тома}

Directory = $10; {имя подкаталога}

Archive =$20; {архивный файл}

AnyFile= $3F; {любой файл}

Комбинацией бит в этом байте можно указывать самые разные варианты, например $ 06 - выбирать все скрытые и/или системные файлы.

Результат работы процедуры FINDFIRST возвращается в переменной типа SEARCHREC. Этот тип в модуле DOS. TPU определяется следующим образом:

type

SearchRec = record

Fill : array [1..21] of Byte;

Attr : Byte;

Time : LongInt;

Size : LongInt;

Name : String.[12]

end;

Здесь Attr - атрибуты файла (см. выше);

Time - время создания или последнего обновления файла; возвращается в упакованном формате; распаковать параметр можно процедурой UNPACKTIME (см.ниже);

Size - длина файла в байтах;

Name - имя и расширение файла. Для распаковки параметра TIME используется процедура

UNPACKTIME(Time: Longlnt; var T:DateTime).

В модуле DOS. TPU объявлен следующий тип DateTime:

type

DateTime = record

year:Word; {год в формате 19ХХ}

month:Word; {месяц I..12}

day:Word; {день 1..31}

hour:Word; {час 0..23}

min:Word; {минуты 0..59}

sec:Word {секунды 0..59}

end;

Результат обращения к процедуре FINDFIRST можно проконтролировать с помощью функции DOSERROR типа WORD, которая возвращает значения:

0 - нет ошибок;

2 - не найден каталог;

18 - каталог пуст (нет указанных файлов).

Процедура FINDNEXT. Возвращает имя следующего файла в каталоге. Формат обращения:

FINDNEXT (<сл.файл>)

Здесь <сл.фаш> - запись типа SEARCHREC (см. выше), в которой возвращается информация о файле.

Следующая простая программа иллюстрирует способ использования процедур FINDFIRST и FINDNEXT. Программа выводит на экран список всех PAS-файлов текущего каталога:

Uses DOS;

var

S: SearchRec;

begin

FindFirst('*.pas',AnyFile,S);

while DosError = 0 do begin

with S do

WriteLn(Name:12,Size:12);

FindNext(S)

end

end.

Процедура GETFTIME. Возвращает время создания или последнего обновления файла. Формат обращения:

GETFTIME (<ф.п.>, <время>)

Здесь <время> - переменная типа LONGINT, в которой возвращается время в упакованном формате.

Процедура SETFTIME. Устанавливает новую дату создания или обновления файла. Формат обращения:

SETFTIME (<ф.п.>, <время>)

Здесь <время> - время и дата в упакованном формате.

Упаковать запись типа DATETIME в переменную типа LONGINT можно процедурой

PACKTIME (var T:DateTime; var Time:LongInt).

(Описание типа DA TETIME см. выше).

Процедура GETFATTR. Позволяет получить атрибуты файла. Формат обращения:

GETFATTR (<ф.п.>, <атрибуты>)

Здесь <атрибуты> - переменная типа WORD, в младшем байте которой возвращаются устанавливаемые атрибуты файла.

Процедура SETFATTR. Позволяет установить атрибуты файла. Формат обращения:

SETFATTR (<ф.п.>, <атрибуты>)

Функция FSEARCH: PATHSTR. Ищет файл в списке каталогов. Формат вызова:

FSEARCH (<имя>, <сп.каталогов>)

Здесь <имя> - имя отыскиваемого файла (строковое выражение или переменная типа PATHSTR; имени может предшествовать путь); <сп.каталогов> - список каталогов, в которых отыскивается файл (строковое выражение или переменная типа STRING); имена каталогов разделяются точкой с запятой.

Результат поиска возвращается функцией FSEARCH в виде строки типа PATHSTR. В строке содержится путь и имя файла, если поиск был успешным, в противном случае возвращается пустая строка.

Тип PATHSTR в модуле DOS.TPU объявлен следующим образом:

type

PathStr = String[79];

Следует учесть, что поиск файла всегда начинается в текущем каталоге и только после этого продолжается в тех, что перечислены в <сп.каталогов>. Если файл обнаружен, дальнейший поиск прекращается, даже если часть каталогов осталась непросмотренной. В частности, если файл зарегистрирован в текущем каталоге, он «заслонит» собой одноименные файлы в других каталогах.

Пусть, например, на диске имеется файл \SUBDIR\MYFILE.PAS. Тогда в случае, если текущий каталог - корневой, обращение

FSEARCH ('MYFILE,PAS','\SUB; \SUBDIR').

вернет строку \SUBDIR\MYFILE.PAS, а обращение

FSEARCH ('MYFILE.PAS1,'\SUB')

вернет пустую строку. Однако, если текущим установлен каталог SUBDIR, то в обоих случаях вернется строка MYFILE.PAS (если файл находится в текущем каталоге,в выходной строке путь к нему не указывается).

Процедура FSPLIT. «Расщепляет» имя файла, т.е. возвращает в качестве отдельных параметров путь к файлу, его имя и расширение. Формат обращения:

FSPLIT (<файл>, <путь>, <имя>, <расширение>)

Здесь <файл> - строковое выражение, содержащее спецификацию файла (имя с расширением и, возможно, с предшествующим путем);

<путь> - переменная типа DIRSTR=STRING [67], в которой возвращается путь к файлу;

<имя> - переменная типа NAMESTR=STRING [8], в которой возвращается имя файла;

<расширение> - переменная типа EXTSTR=STRING [4], в которой возвращается расширение с предшествующей ему точкой.

Процедура не проверяет наличие на диске указанного файла. В качестве входного параметра может использоваться переменная типа PATHSTR.

Функция FEXPAND: PATHSTR. Дополняет файловое имя до полной спецификации, т.е. с указанием устройства и пути. Формат вызова:

FEXPAND (<файл>)

Здесь <файл> - строковое выражение или переменная типа PATHSTR.

Функция не проверяет наличие указанного файла на диске, а просто дополняет имя файла недостающими параметрами - текущим устройством и путем к текущему каталогу. Результат возвращается в строке типа PATHSTR.

Поиск
Календарь
«  Декабрь 2017  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
25262728293031
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz