Это зависит от того, есть ли у вас записи фиксированного или переменного размера.
Записи разного размера
Что ж, что вам нужно сделать, так это переместить все содержимое файла после записи, от которой вы хотите избавиться, перезаписать часть, которую вы хотите удалить, а затем обрезать файл. Это немного сложно сделать на месте (то есть внутри того же файла), так как вы можете читать только достаточно данных, чтобы избежать перезаписи остальной части файла на каждой итерации вашего цикла перемещения вверх.
Более простой метод, который создаст новый файл из старого, выглядит следующим образом:
- Обратите внимание на положение потока перед десериализацией элемента.
- Если элемент совпадает, запишите положение потока, как оно есть сейчас (две позиции теперь очерчивают область файла, в которой находится запись, от которой вы хотите избавиться)
- Создайте новый файл и сначала скопируйте с самого начала то же количество байтов, что и в первой позиции, из старого потока (того, в котором вы нашли запись) в новый поток.
- Поместите старый поток в положение, которое вы отметили после найденной записи, и скопируйте все, что вы можете найти оттуда, в новый поток.
Это создаст новый файл с тем же содержимым, что и старый, за исключением того, что вы пропустите запись, от которой хотите избавиться.
Если вы можете перебрать все записи и просто определить, хотите ли вы их сохранить или нет, вот еще более простой метод:
- Откройте новый поток
- Десериализовать элемент из старого потока
- Если вы хотите сохранить его, сериализуйте его обратно в новый поток
- И так по остальным пунктам.
Записи фиксированного размера
Просто прочтите последнюю запись файла, поместите файл обратно в позицию записи, которую вы хотите удалить, и перезапишите его содержимым последней записи, которую вы только что прочитали, а затем обрежьте файл непосредственно перед последней записью файл.
person
Lasse V. Karlsen
schedule
30.11.2011