Модификация или удаление строки из текстового файла низкоуровневым способом?
я работаю с текстовым файлом в Delphi, и я неЯ не хочу использовать метод загрузки / сохранения со списком строк. Я намерен поддерживать открытый файловый поток, где я читаю и записываю свои данные, сохраняя огромные объемы данных на жестком диске, а не в памяти. У меня есть простая концепция записи новых строк в текстовый файл и чтения их, но когда дело доходит до их изменения и удаления, я не могу найти никаких хороших ресурсов.
Каждая строка в этом файле содержит имя и знак равенства, а остальные - данные. Например,SOMEUNIQUENAME=SomeStringValue
, Я намерен держать файл открытым в течение некоторого времени внутри потока. Этот поток выполняет входящие запросы для получения, установки или удаления определенных полей данных. я используюWriteLn
а такжеReadLn
в цикле, оцениваяEOF
, Ниже приведен пример того, как я читаю данные:
FFile = TextFile;
...
function TFileWrapper.ReadData(const Name: String): String;
var
S: String; //Temporary line to be parsed
N: String; //Temporary name of field
begin
Result:= '';
Reset(FFile);
while not EOF(FFile) do begin
ReadLn(FFile, S);
N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
if N = UpperCase(Name) then begin
Delete(S, 1, Pos('=', S));
Result:= S;
Break;
end;
end;
end;
... и затем я запускаю событие, которое информирует отправителя о результате. Запросы находятся внутри очереди, которая является своего рода насосом сообщений для этих запросов. Поток просто обрабатывает следующий запрос в очереди несколько раз, подобно тому, как работают типичные приложения.
У меня есть процедуры, готовые написать и удалить эти поля, но я неЯ не знаю, что мне нужно сделать, чтобы действительно выполнить действие с файлом.
procedure TFileWrapper.WriteData(const Name, Value: String);
var
S: String; //Temporary line to be parsed
N: String; //Temporary name of field
begin
Result:= '';
Reset(FFile);
while not EOF(FFile) do begin
ReadLn(FFile, S);
N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
if N = UpperCase(Name) then begin
//How to re-write this line?
Break;
end;
end;
end;
procedure TFileWrapper.DeleteData(const Name: String);
var
S: String; //Temporary line to be parsed
N: String; //Temporary name of field
begin
Result:= '';
Reset(FFile);
while not EOF(FFile) do begin
ReadLn(FFile, S);
N:= UpperCase(Copy(S, 1, Pos('=', S)-1));
if N = UpperCase(Name) then begin
//How to delete this line?
Break;
end;
end;
end;
В конце концов, мне нужно избегать загрузки всего файла в память, чтобы иметь возможность выполнить это.