Я хочу обработать текстовый файл по строкам. В прежние дни я загрузил файл в 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
также не поддерживает блокировку, если вы не измените его на 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;
Итак, теперь, хотя я не получил блокировок, я возвращаюсь к загрузке всего файла в память.
Есть ли какая-то альтернатива Assign
/ReadLn
, где я могу читать файл по очереди, не беря блокировку совместного доступа?
Я бы скорее не попал прямо в Win32 CreateFile
/ReadFile
и имел дело с распределением буферов и обнаружением CR
, LF
, CRLF
.
Я думал о файлах с отображением памяти, но существует трудность, если весь файл не подходит (карта) в виртуальную память и должен одновременно отображать представления (фрагменты) файла. Начинает становиться уродливым.
Я просто хочу Reset
с помощью fmShareDenyNone
!