Я хочу обрабатывать текстовый файл построчно. Раньше я загружал файл в StringList:
slFile := TStringList.Create();
slFile.LoadFromFile(filename);
for i := 0 to slFile.Count-1 do
begin
oneLine := slFile.Strings[i];
//process the line
end;
Проблема в том, что когда размер файла становится несколько сотен мегабайт, мне нужно выделить огромный кусок памяти; когда на самом деле мне нужно только достаточно памяти, чтобы держать одну строку за раз. (Кроме того, вы не можете точно указать прогресс, когда система заблокирована при загрузке файла на шаге 1).
Я попытался использовать стандартные и рекомендуемые процедуры ввода-вывода файлов, предоставляемые Delphi:
var
f: TextFile;
begin
Reset(f, filename);
while ReadLn(f, oneLine) do
begin
//process the line
end;
Проблема с Assign в том, что нет возможности читать файл без блокировки (т.е. fmShareDenyNone). Предыдущий пример stringlist также не поддерживает no-lock, если вы не измените его на LoadFromStream:
slFile := TStringList.Create;
stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
slFile.LoadFromStream(stream);
stream.Free;
for i := 0 to slFile.Count-1 do
begin
oneLine := slFile.Strings[i];
//process the line
end;
Итак, теперь, несмотря на то, что у меня не было никаких блокировок, я вернулся к загрузке всего файла в память.
Есть ли альтернатива _9 _ / _ 10_, где я могу читать файл построчно, не блокируя общий доступ?
я бы предпочел не попадать прямо в Win32 _11 _ / _ 12_ и иметь дело с распределением буферов и обнаружением CR, LF, CRLF.
Я думал о файлах с отображением памяти, но возникает проблема, если весь файл не помещается (отображается) в виртуальную память, и приходится отображать представления (части) файла за раз. Начинает становиться уродливым.
я просто хочу Reset с fmShareDenyNone!