Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление записей из файла


сергей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


Наверх

Титульная страница Поиск, карта сайта Написать письмо