Теоретический материал: файловый ввод-вывод (Паскаль)
Дополнительные процедуры и функции для работы с файлами
Рассмотрим три процедуры из модуля System.
Изменение имени файла производится процедурой
rename(МуFilе, FileName); |
первый аргумент которой - переменная файлового типа, а второй аргумент - строкового типа - новое имя файла, которое может быть сокращенным или полным (с указанием пути). Действие этой процедуры эквивалентно действию аналогичной процедуры DOS.
Уничтожение части файла от текущего положения указателя до конца файла производится процедурой
truncate(МуFilе); |
Процедура применима к любым типам файлов, кроме текстовых; файл должен быт предварительно открыт.
Уничтожение всего файла производится процедурой
erase(МуFilе); |
действие которой эквивалентно удалению файла в операционной системе DOS. Процедура неприменима к открытым файлам.
Рассмотрим некоторые процедуры работы с файлами, входящие в модуль Dos. Напомним, что для его подключения требуется указать
Uses |
Ряд свойств файла, хранящегося на диске, кодируются так называемыми атрибутами. Атрибуты файла записываются не в сам файл, а в информационный раздел каталога, в котором хранится файл. Для хранения атрибутов отводится один байт, единица в определенном бите которого означает наличие свойства, а нуль - отсутствие. Соответствие битов и свойств показывает схема, приведенная на рисунке.
0 - Только чтение ReadOnly=1,
1 - Скрытый файл Hidden=2,
2 - Системный файл SysFile=4,
3 - Метка тома VolumeID=8,
4 - Подкаталог Directory=16,
5 - Архивный файл Archive=32,
Произвольный файл AnyFile=63.
Каждому атрибуту соответствует определенная константа, равная 2k, где k - номер бита. Эти константы описаны в модуле Dos, их значения и имена приведены на схеме. В целом байт атрибутов образуется как сумма соответствующих ему констант. Установка атрибута «только чтение» приводит к невозможности изменения содержимого файла или его удаления.
Скрытые файлы игнорируются некоторыми командами операционной системы, в частности, они не показываются по команде Dir. Системные файлы - файлы операционной системы Dos. Атрибут «Архивный» означает, что для этого файла не была создана резервная копия командой BackUp.
Большинство файлов имеют этот атрибут. Определить атрибуты файла можно с помощью процедуры
GetFAttr(MyFile, Attr); |
которая возвращает переменную Attr типа word, содержащую код атрибутов файла.
Например, проверить свойство «только для чтения» можно следующим образом:
GetFAttr(MyFile, Attr); |
Установка требуемых атрибутов файла производится процедурой
setFAttr (MyFile, Attr); |
Процедуры для поиска на диске требуемых файлов используют специальный тип записи SearchRec, определенный в модуле Dos. Запись
Туре |
Первое поле записи - массив Fill - используется операционной системой и не должно изменяться в пользовательских программах. Содержание поля Attr - атрибуты файла, рассмотренные выше. Поле Time содержит дату и время записи файла в упакованном виде, для распаковки служит процедура UnpackTime. Size - размер файла в байтах. Name - имя файла, включая разделительную точку и расширение.
Процедура
FindFirst (SearchPath, Аttr, SearchResult); |
ищет в каталоге первый файл, удовлетворяющий заданной спецификации. Параметры SearchPath и Аttr содержат исходные данные для поиска. Возвращаемый результат поиска - SearchResult - запись типа SearchRec. SearchPath - строка, содержащая полное имя файла, в том числе каталог, в котором необходимо искать файл, и имя файла. Имя файла (но не путь) может содержать символы звездочки и вопросительного знака, которые, соответственно, заменяют любую последовательность символов или один произвольный символ.
Если путь не приводится, поиск идет в рабочем каталоге. Следовательно, SearchPath = '*.dat' указывает на все файлы с расширением "dat" в текущем каталоге.
Процедура FindNext(SearchResult) употребляется только после процедуры FindFirst и продолжает последовательно поиск файлов с определенным процедурой FindFirst шаблоном.
Функция FSearch(SearchString, DirList) ищет файл, заданный строкой SearchString, в заданном списке каталогов DirList. Список каталогов записывается так же, как в команде DOS Path, то есть различные каталоги разделены точкой с запятой. Результат этой функции - полное имя файла, если он найден по указанным путям.
Функция FExpand(FileName), получив имя файла FileName, расширяет его до полного имени, используя для этого имя текущего каталога. Если в качестве FileName задано имя с полным путем, функция не изменяет его. Если задано только имя файла, то дописывается текущий каталог. Если запись FileName начинается с символа "обратный слэш", то берется текущий диск и к нему дописывается имя FileName. Если запись FileName начинается с символов "..", то берется часть имени текущего каталога на уровень выше.
Процедура FSplit(WholeFileName, Dir, Name, Ext), получив в качестве аргумента полное имя файла WholeFileName, разделяет его на три составные части и возвращает переменные параметры Dir - каталог, Name - имя файла, Ext - расширение. Для каталога, имени файла и расширения в модуле DOS предусмотрены специальные типы - строки ограниченной длины: PathStr, NameStr, ExtStr.
Многие подпрограммы модуля Dos используют переменную DosError для указания на результат выполнения операции. Нулевое значение переменной указывает на отсутствие ошибок, ряд других возможных значений DosError приведен в таблице:
Код 2 3 5 8 18 | Значение Файл не найден Путь не найден Нет доступа Недостаточно памяти Больше нет файлов (при поиске) |
Обратим внимание, что типизированные переменные пишутся в файл в том виде, в каком они используются в памяти ЭВМ. Если мы пытаемся прочитать содержимое такого файла обычными средствами DOS, например, нажав F3 в Norton Commander, или непосредственно в среде Паскаль, то каждый байт этих записей воспроизведется как соответствующий символ кодовой таблицы ASCII. Например, если файл имеет байтовый тип, и в него пишутся числа 65, 66, 67, то при его чтении мы увидим АВС. Такая запись данных компактна и удобна, если создаваемые файлы читаются другими программами, для которых эта кодировка естественна. В тех случаях, когда файлы предназначены для просмотра человеком, требуется перевод данных в текстовую форму.