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