Удаление компонент из файла записей



Различают два способа удаления компонент из файла:

1) Компоненты физически удаляются из файла. При этом все компоненты, которые располагаются в файле следом за удаляемой, последовательно, без изменения их порядка, смещаются на место удаляемой компоненты. А последняя компонента файла отсекается.

Такой способ удаления требует значительных затрат времени и системных ресурсов, поэтому используется редко. Преимуществом этого способа является то, что освобождается место на диске.

2) Компонента из файла физически не удаляется, а только помечается на удаление. Будем такое удаление называть логическим. При дальнейшей обработке файла логически удаленные компоненты не рассматриваются.

При интенсивной работе с файлом количество логически удаленных компонент растет, и наступает момент, когда их нужно удалить физически. Обычно этой процедурой руководит системный администратор. Выполняется такая процедура в то время, когда ни один пользователь не работает с базой данных (обычно ночью или в выходной).

Логическое удаление компонент

Для осуществления логического удаления каждая компонента файла записей должна включать в себя специальное служебное поле (назовем его del). Поле del принимает значение TRUE, если компонента на удаление, и принимает значение FALSE, если компонента не удалена.

Логическое удаление по своей сути является корректировкой файла. Поэтому алгоритм логического удаления по строению совпадает с алгоритмом корректировки и содержит аналогичные шаги (см.рис.14.). Шаг 1-2 выполняет поиск ik-номер удаляемой компоненты. В этом шаге необходимо рассматривать только те компоненты, которые не удалены. Поэтому в алгоритм включена проверка на существование рассматриваемой компоненты (условие NOT a.del). При нахождении необходимой компоненты в файле указатель переставляется за пределы файла оператором seek(F,filesize(F)), т.к. дальнейший просмотр компонент теряет смысл. В шаге 3-4 непосредственно происходит пометка компоненты на удаление. Для этого значение поля a.del удаляемой компоненты задается равным TRUE, указатель устанавливается на позицию ik-номер удаляемой компоненты, и преобразованная, т.е. помеченная на удаление, компонента записывается в файл.

В тексте программы логическое удаление выглядит следующим образом:

• • •

write(’Введите ФИО удаляемого человека:’);

readln(key);

reset(F);

{1-2}

FLAG:=TRUE;

while NOT EOF(F) do

begin

read(F,a);

if NOT a.del then

if a.FIO=key then

begin

FLAG:=FALSE;

ik:=filepos(F)-1;

seek(F,filesize(F));

end;

end;

{3-4}

a.del:=TRUE;

seek(F,ik);

write(F,a);

close(F);

• • •

 

Логически удаленные компоненты можно восстановить. Для этого нужно выполнить аналогичный алгоритм. Но теперь придется искать в файле, наоборот, удаленные компоненты, и восстанавливать их, присваивая полю a.del значение FALSE (см.рис.15).


 

 


Дата добавления: 2018-10-27; просмотров: 303; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!