![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление записей из файла
сергей2010 © (2010-12-27 14:32:00)Добрый день. Имеется текстовой файл заполненный записями вида :
---Запись1---
..текст..
..текст..
..текст..
---Запись1: конец---
---Запись2---
..текст..
..текст..
..текст..
---Запись2: конец---
и.т.д.
Записи не имеют последовательности. То есть, может идти сначала "запись1" а за ней "запись 23".
Файл постоянно дописывается методом:
var
F : TextFile;
begin
AssignFile(F,'file.txt');
Append(f);
writeln(f, text);
CloseFile(F);
end;
Так вот, подскажите пожалуйста, как можно удалить(перезаписать) какую-либо запись в файле, не загружая его в память (файл - лог, и может быть объемом до 1 гига)? Или подскажите метод удаления (или лучше замены) записи.
Я пользовался вот таким методом но это довольно долго... Может подскажете что получше... :
var
BaseItem, s: string;
F,f2 : textfile;
get:bool;
begin
s := pchar('--'+cap+'--');
get := false;
AssignFile(F, file);
AssignFile(F2, file2);
reset(f);
Rewrite(f2);
try
while not Eof(F) do
begin
Readln(F, LogStr);
If s = LogStr then get := true;
if get = false then writeln(f2, LogStr);
if BaseItem = '--| '+cap+' - END |--' then get := false;
end;
finally
CloseFile(F);
DeleteFile(file);
end;
writeln(f2, '--'+Cap+'--');
writeln(f2, NewText);
writeln(f2, '--| '+Cap+' - END |--');
CloseFile(F2);
RenameFile(file2, file);
end;
Anatoly Podgoretsky (2010-12-27 14:59:00) [1]> сергей2010 (27.12.2010 14:32:00) [0]
Современные процессоры пока не умеют работать не загружая в память, все
опереции делаются только с память физической или регистровой.
Ega23 (2010-12-27 14:51:00) [2]1. Если это действительно лог, то удалять из него ничего нельзя. Он не для этого предназначен.
2. Изменить формат хранилища. Например - XML. Или СУБД простую взять
clickmaker (2010-12-27 14:42:00) [3]впрочем, записи можно не удалять, а помечать как удаленные. Тогда достаточно SetFilePointer / WriteFile
clickmaker (2010-12-27 14:40:00) [4]> как можно удалить(перезаписать) какую-либо запись в файле,
> не загружая его в память
не загружать совсем не получится. Но можно этот процесс оптимизировать. см. Memory-mapped files в MSDN