我的程序中有一个FindFile例程,它会列出文件,但如果填写了“包含文本”字段,那么它应该只列出包含该文本的文件。
如果输入了“包含文本”字段,那么我会在找到的每个文件中搜索文本。我目前的做法是:
var
FileContents: TStringlist;
begin
FileContents.LoadFromFile(Filepath);
if Pos(TextToFind, FileContents.Text) = 0 then
Found := false
else
Found := true;
上面的代码很简单,而且通常工作正常。但它有两个问题:
对于非常大的文件(例如300 MB),它会失败
我觉得可以更快。这还不错,但如果有一个简单的方法可以加快速度,为什么要等10分钟搜索1000个文件呢?
我需要这个来为Delphi 2009工作,并搜索可能是Unicode也可能不是Unicode的文本文件。它只需要适用于文本文件。
那么,我如何加快搜索速度,同时使其适用于非常大的文件呢?
额外的好处:我还想允许一个“忽略案例”选项。这是一个更难提高效率的问题。有什么想法吗?
解决方案:
嗯,mghie指出了我之前的问题我如何在Delphi中有效地读取许多文件的前几行,正如我所回答的,它是不同的,并且没有提供解决方案。
但他让我觉得我以前也做过这件事。我为大文件构建了一个块读取例程,将其分解为32 MB的块。我用它来读取我的程序的输入文件,这可能是巨大的。这个程序运行得又好又快。所以第一步是对我正在查看的这些文件做同样的操作。
所以现在的问题是如何在这些区块内有效地进行搜索。我之前确实有一个关于这个主题的问题:Delphi中有一个高效的全词搜索函数吗?和RRUZ向我指出了SearchBuf例程。
这也解决了“奖金”,因为SearchBuf有包括全词搜索(该问题的答案)和MatchCase/noMatchCase(奖金的答案)在内的选项。
所以我要跑了。再次感谢SO社区。