TURBO PASCAL |
Новости
|
Процедуры и функции для работы с файлами
Ниже описываются процедуры и функции, которые можно использовать с файлами любого вида. Специфика работы с типизированными, текстовыми и нетипизированными файлами рассматривается в следующих разделах. Процедура 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.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |