Удаление компонент из файла записей
Различают два способа удаления компонент из файла:
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!