Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

2.1.12. Дописывание данных в конец файла

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

(* Поиск конца файла *)

fdseek(filedes, 0, SEEK_END);

fdwrite(filedes, appbuf, BUFSIZE);

Тем не менее более изящный способ состоит в использовании одного из дополнительных флагов вызова fdopen, Open_APPEND. Если установлен этот флаг, то перед каждой записью указатель будет устанавливаться в конец файла. Это может быть полезно, если нужно лишь дополнить файл, застраховавшись от случайной перезаписи данных в начале файла.

Можно использовать флаг Open_APPEND следующим образом:

filedes := fdopen('yetanother', Open_WRONLY or Open_APPEND);

Каждый последующий вызов fdwrite будет дописывать данные в конец файла. Например:

fdwrite(filedes, appbuf, BUFSIZE);

Упражнение 2.14. Напишите процедуру fileopen, имеющую два аргумента: первый – строку, содержащую имя файла, и второй строку, которая может иметь одно из следующих значений:

r – открыть файл только для чтения;

w – открыть файл только для записи;

rw – открыть файл для чтения и записи;

а – открыть файл для дописывания.

процедура fileopen должна возвращать дескриптор файла или код ошибки -1.

2.1.13. Удаление файла

Существует один метод удаления файла из системы – при помощи вызова unlink.

Описание

uses linux;

Function UnLink(Var Path): Boolean;

Вызов имеет единственный аргумент – строку с именем удаляемого файла, например:

unlink('/tmp/usedfile');

Вызов возвращает true в случае успешного завершения и false – в случае ошибки.

2.1.14. Системный вызов fcntl

Системный вызов fcntl был введен для управления уже открытыми файлами. Это довольно странная конструкция, которая может выполнять разные функции.

Описание

uses linux;

/* Примечание: тип последнего параметра может меняться */

Function Fcntl(filedes:longint;Cmd:Integer):integer;

Function Fcntl(var filedes:Text;Cmd:Integer):integer;

Procedure Fcntl(Fd:text;Cmd:Integer;Arg:longint);

Procedure Fcntl(Fd:longint;Cmd:longint;Arg:Longint);

Системный вызов fcntl работает с открытым файлом, заданным дескриптором файла filedes. Конкретная выполняемая функция задается выбором одного из значений параметра cmd из модуля linux. Тип третьего параметра зависит от значения параметра cmd. Например, если вызов fcntl используется для установки флагов статуса файла, тогда третий параметр будет целым числом. Если же, как можно будет увидеть позже, вызов fcntl будет использоваться для блокировки файла, то третий параметр будет указателем на структуру lock. Иногда третий параметр вообще не используется.

Некоторые из этих функций относятся к взаимодействию файлов и процессов, и мы не будем рассматривать их здесь; тем не менее две из этих функций, заданные значениями F_GETFL и F_SETFL параметра cmd, представляют для нас сейчас интерес.

При задании параметра F_GETFL вызов fcntl возвращает текущие флаги статуса файла, установленные вызовом fdopen. Следующая функция filestatus использует fcntl для вывода текущего статуса открытого файла.

(*

* Функция filestatus описывает текущий статус файла

*)

uses linux;

function filestatus(filedes:integer):integer;

var

arg1:integer;

begin

arg1 := fcntl (filedes, F_GETFL);

if arg1 = -1 then

begin

writeln('Ошибка чтения статуса файла');

filestatus := -1;

exit;

end;

write('Дескриптор файла ', filedes, ': ');

(*

* Сравнить аргумент с флагами открытия файла.

*)

case (arg1 and Open_ACCMODE) of

Open_WRONLY:

write('Только для записи');

Open_RDWR:

write('Для чтения-записи');

Open_RDONLY:

write('Только для чтения');

else

write('Режим не существует');

end;

if (arg1 and Open_APPEND)<>0 then

write (' - установлен флаг append');

writeln;

filestatus := 0;

end;

Следует обратить внимание на проверку установки определенного бита во флаги статуса файла в переменной arg1 при помощи побитового оператора И, обозначаемого AND. Поле интересующих нас битов вырезается с помощью специальной маски Open_ACCMODE, определенной в модуле linux. Дальнейшие действия осуществляются с учетом того, что в данном поле не может быть выставлено более одного бита, поскольку эти три режима доступа к файлу не совместимы.

Значение F_SETFL используется для переустановки связанных с файлом флагов статуса. Новые флаги задаются в третьем аргументе вызова fcntl. При этом могут быть установлены только некоторые флаги, например, нельзя вдруг превратить файл, открытый только для чтения, в файл, открытый для чтения и записи. Тем не менее с помощью F_SETFL можно задать режим, при котором все следующие операции записи будут только дописывать информацию в конец файла:

if (fcntl(filedes, F_SETFL, Open_APPEND) = -1) then

writeln('Ошибка вызова fcntl');

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal