我有一個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
另一種方法是查找文件夾或文件夾中的所有文件並將它們存儲在內存中,然後檢查這些文件,假設它們不會在您的下面更改。在做類似的事情時,對我來說速度會更快,即使存儲內存的代價也是如此。 –