Объектный подход к файлам
Базовый объект TStream (поток) позволяет абстрагироваться от понятия «файл» и его носителя. Файл представляет собой непрерывный поток символов без всякой заранее определенной структуры. Рассмотрим работу объекта TFileStream одного из потомков объекта TStream, предназначенного для работы с файлами на жестком диске.
Для работы с этим объектом используются следующие методы.
Create(S;M:Word) ‑ создание файла под именем S в режиме M: fmCreate (создание нового файла), fmOpenRead (для чтения), fmOpenWrite (для записи), fmOpenReadWrite (для чтения и записи).
Free ‑ закрытие файла.
Read(Var B;N:LongInt):LongInt‑ чтение в переменную B очередных N байтов, начиная с текущей позиции. Возвращается число прочитанных байтов.
Write(B;N:LongInt):LongInt ‑ запись из переменной B в файл N байтов, начиная с текущей позиции. Возвращается число выведенных байтов.
Seek(N:LongInt;O:Word):LongInt ‑ установка текущей позиции в файле путем смещения на N байтов (отсчет с нуля) относительно O: soFromBeginning (от начала файла), soFromCurrent (от текущей позиции файла), soFromEnd (от конца файла и N<=0).
SetSize(N:LongInt) ‑ установка нового размера файла, равного N байтам.
CopyFrom(S:TStream;N:LongInt):LongInt ‑ копирование первых N байтов файла ‑ объекта S в текущий файл ‑ объект. Возвращается число фактически скопированных байтов.
В распоряжении имеются два свойства объекта: Size(размер файла), Position(текущая позиция файла от его начала).
Пример формирования и чтения файла «d:\prim.dat»:
Procedure TForm1.Button1Click(Sender: TObject); //обработка кнопки
Var S:TFileStream; B:Array [1..3] Of Char; //переменные
Begin Try S:=TFileStream.Create('d:\prim.dat',fmCreate); //открытие файла
S.Write('0123456789',10); //вывод в файл текста «0123456789»
S.Free; {закрытие файла} S:=TFileStream.Create('d:\prim.dat',fmOpenRead);
S.Seek(5,soFromBeginning); //установка текущей позиции на пятый байт
S.Read(B,3); Label1.Caption:= Copy(Z,1,3); //вывод из файла цифр 5,6,7
Finally S.Free; {закрытие файла в любом случае} End; End;
Файлы Windows
В функциях обработки файлов Windows могут использоваться атрибуты файлов и режимы доступа.
Атрибуты файлов задаются именованными константами: faReadOnly (только чтение), faHidden (скрытый), faSysFile (системный), faVolumID (имя диска), faDirectory (каталог), faArchive (архив), faAnyFile (любой).
Режимы доступа при открытии файла задаются константами:
fmOpenRead (только чтение), fmOpenWrite (запись), fmOpenReadWrite (чтение и запись), fmShareCompat (совместимый с FCB), fmShareExclusive (монопольное использование), fmShareDenyWrite (запрет записи для других приложений), fmShareDenyRead (запрет чтения для других приложений), fmShareDenyNone (многопользовательский разделяемый режим).
В системе Windows каждый файл вместо файловой переменной имеет уникальный цифровой дескриптор, называемый обычно Hanle (он обозначен в описаниях процедур и функций буквой H), значение которого формируется функциями открытия файла FileCreate или FileOpen:
FileCreate(S)‑ создание файла под именем S, возвращение его дескриптора.
FileOpen(S;M:Integer) ‑ открытие уже существующего файла S в режиме M (комбинация fmXXXX и fmShareXXXX, соединенных операциями Or), и возвращение его дескриптора.
Запрещается одновременное использование для одного файла функции и процедур файлов Паскаля и Windows.
Приведем список других основных процедур и функций.
FileClose(H) ‑ закрытие файла с дескриптором H (см. FileCreat, FileOpen).
FileGetDate(H):Integer ‑ возвращает в формате DOS дату и время создания открытого файла с дескриптором H.
FileRead(H;Var B;N:Integer):Integer ‑ читает N байтов из открытого файла c дескриптором H в переменную B и возвращает число cчитанных байтов.
Обычно переменной B является одномерный массив элементов типа Сhar.
FileSeek(H,N,O:Integer):Integer ‑ устанавливает в открытом файле c дескриптором H позицию со смещением N от начала (O=0) текущего положения (O=1) или от конца (O=2) файла соответственно. Возвращает новую позицию или -1 в случае ошибки.
FileSetDate(H,A:Integer):Integer ‑ устанавливает в формате DOS дату и время создания (A) открытого файла с дескриптором H и возвращает 0 при успешном выполнении, иначе - код ошибки Windows. Дату можно получить из значения типа TDateTime функцией DateTimeToFileDate.
FileWrite(H;B;N:Integer):Integer ‑ записывает N байтов в открытый файл c дескриптором H из переменной B и возвращает число выведенных байтов.
Пример:
Procedure TForm1.Button1Click(Sender: TObject); //обработка кнопки
Var H:Integer; S,Z: Array [1..5] of Char; //объявление переменных
Begin Try H:=FileCreate('c:\prim.dat'); //открытие создаваемого файла
S:='12345';FileWrite(H,S,SizeOf(S));{вывод S}FileClose(H);//закрытие файла
H:=FileOpen('c:\prim.dat',fmOpenRead); //открытие файла для чтения
FileSeek(H,‑4,2);//пропуск назад от конца файла 4 байта, текущая позиция 2
FileRead(H,Z,3);//вывести из файла три байта, начиная с текущего второго
Label1.Caption:=Copy(Z,1,3); //вывод Z в метку (будет текст: 234)
Finally FileClose(H); {закрытие файла в любом случае} End; End;
Дата добавления: 2016-03-22; просмотров: 572;