我有一个Tstringlist,其中包含我在磁盘上使用搜索填充的很长文件列表。 该列表包含具有不同扩展名的文件 - .docx .xlsx等 填充此列表是通过一次搜索一个扩展名来完成的,因此需要相当长的时间 我想要做的是使这样我就可以开始多个搜索,并使用文件名填充相同的TStringList。 我有一个想法,它应该由一些线程来完成,但这对我来说是一张白纸。如何使用线程进行搜索
任何提示或可能是我应该学习的样本?
下面的代码是一个我用今天
function TFiles.Search(aList: TstringList; aPathname: string; const aFile: string = '*.*'; const aSubdirs: boolean = True): integer;
var
Rec: TSearchRec;
begin
Folders.Validate(aPathName, False);
if FindFirst(aPathname + aFile, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
aList.Add(aPathname + Rec.Name);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
Result := aList.Count;
if not aSubdirs then Exit;
if FindFirst(aPathname + '*.*', faDirectory, Rec) = 0 then
try
repeat
if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
Files.Search(aList, aPathname + Rec.Name, aFile, True);
until FindNext(Rec) <> 0;
finally
FindClose(Rec);
end;
Result := aList.Count;
end;
我怀疑这会给你一个性能改善。您将有几个进程同时遍历磁盘,但是会查找不同的文件类型。这将导致大量的磁盘垃圾。让FindFirst找到* all *文件,然后将具有所需扩展名的文件名存储在TStringList中会更好。磁盘I/O是这里的瓶颈。 –
搜索所有文件并将适当的文件添加到列表中会更好。 – MBo
另一种方法是查找文件夹或文件夹中的所有文件并将它们存储在内存中,然后检查这些文件,假设它们不会在您的下面更改。在做类似的事情时,对我来说速度会更快,即使存储内存的代价也是如此。 –