如何有效地阅读Delphi中许多文件的最初几行

lke*_*ler 7 delphi file-io large-files

我的程序中有一个"查找文件"功能,可以找到我的程序读取的带有.ged后缀的文本文件.我在类似于资源管理器的窗口中显示找到的结果,如下所示:

在此输入图像描述

我使用标准的FindFirst/FindNext方法,这非常有效.上面显示的584个文件可在几秒钟内找到并显示.

我现在要做的是在显示屏上添加两列,显示每个文件中包含的"Source"和"Version".此信息通常位于每个文件的前10行内,如下所示:

1 SOUR FTM
2 VERS Family Tree Maker (20.0.0.368)
Run Code Online (Sandbox Code Playgroud)

现在我自己解析这个问题没有问题,这不是我要问的问题.

我需要帮助的只是如何最快速地从这些文件加载​​前10行,以便我可以解析它们.

我试图做一个StringList.LoadFromFile,但加载大文件需要花费太多时间,例如1 MB以上的文件.

由于我只需要前10行左右,我最好如何获得它们?

我正在使用Delphi 2009,我的输入文件可能是也可能不是Unicode,所以这需要适用于任何编码.


跟进:谢谢Antonio,

我最终做了这个工作正常:

var
  CurFileStream: TStream;
  Buffer: TBytes;
  Value: string;
  Encoding: TEncoding;

try
  CurFileStream := TFileStream.Create(folder + FileName, fmOpenRead);
  SetLength(Buffer, 256);
  CurFileStream.Read(Buffer[0], 256);
  TEncoding.GetBufferEncoding(Buffer, Encoding);
  Value := Encoding.GetString(Buffer);
  ...
  (parse through Value to get what I want)
  ...
finally
  CurFileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

Ant*_*ula 14

使用TFileStream并使用Read方法读取所需的字节数.以下是读取位图信息的示例,该位图信息也存储在文件的开头.

http://www.delphidabbler.com/tips/19

  • +1.只需读取前4 KB的数据:这可能足以完全包含前几行,而且它是从磁盘读取的最小数据量.如果您正在读取许多文件(并且584个文件并不完全"很多"),并且您希望获得想象,那么您可能希望打开文件而不使用缓存,使用CreateFile,并将Handle传递给THandleStream:它可能会提供由于操作系统知道不会缓存很可能不会再次请求的数据,因此只需进行少量改进. (5认同)
  • +1我会使用TFileStream,因为它很好地包装了本机OS文件API. (4认同)
  • TFileStream缺少readLn功能.如果可能不够好怎么办? (2认同)