Delphi文件搜索中如何排除指定文件夹?
Delphi目录搜索排除特定文件夹的修改方案
要让你的递归文件搜索代码排除指定文件夹,只需要在进入子目录递归前增加目录判断逻辑即可。以下是两种实用的修改方案:
方案1:支持排除多个文件夹(通用版)
修改原函数,新增一个排除文件夹的数组参数,在递归前检查当前目录是否属于排除列表:
procedure FindFilePattern(root: String; pattern: String; const ExcludeFolders: array of String); var SR: TSearchRec; i: Integer; IsExcluded: Boolean; begin root := IncludeTrailingPathDelimiter(root); if FindFirst(root + '*.*', faDirectory or faHidden, SR) = 0 then begin repeat Application.ProcessMessages; if ((SR.Attr and faDirectory) = faDirectory) and (Pos('.', SR.Name) = 0) then begin // 判断当前目录是否在排除列表中(不区分大小写) IsExcluded := False; for i := Low(ExcludeFolders) to High(ExcludeFolders) do begin if SameText(SR.Name, ExcludeFolders[i]) then begin IsExcluded := True; Break; end; end; // 非排除目录才进入递归 if not IsExcluded then FindFilePattern(root + SR.Name, pattern, ExcludeFolders); end else begin if Pos(pattern, SR.Name) > 0 then Form1.ListBox1.Items.Add(Root + SR.Name); end; until FindNext(SR) <> 0; FindClose(SR); end; end;
调用示例
如果需要排除Windows和Program Files目录,调用方式如下:
FindFilePattern('C:\', '*.txt', ['Windows', 'Program Files']);
方案2:仅排除单个文件夹(简化版)
如果只需要排除固定的单个文件夹(比如C盘的Windows目录),可以直接简化判断逻辑:
procedure FindFilePattern(root: String; pattern: String); var SR: TSearchRec; begin root := IncludeTrailingPathDelimiter(root); if FindFirst(root + '*.*', faDirectory or faHidden, SR) = 0 then begin repeat Application.ProcessMessages; if ((SR.Attr and faDirectory) = faDirectory) and (Pos('.', SR.Name) = 0) then begin // 跳过Windows目录(不区分大小写) if not SameText(SR.Name, 'Windows') then FindFilePattern(root + SR.Name, pattern); end else begin if Pos(pattern, SR.Name) > 0 then Form1.ListBox1.Items.Add(Root + SR.Name); end; until FindNext(SR) <> 0; FindClose(SR); end; end;
关键说明
- 使用
SameText进行目录名判断,适配Windows系统不区分大小写的特性 - 核心逻辑是在递归进入子目录前跳过排除目录,避免遍历该目录下的所有文件和子目录
内容的提问来源于stack exchange,提问作者robertjains
相关产品推荐
相关产品推荐

