我正在此线程(如何通过Delphi中的所有子目录搜索文件)中使用以下代码来递归查找文件:
procedure FindFilePattern(root:String;pattern:String);
var
SR:TSearchRec;
begin
root:=IncludeTrailingPathDelimiter(root);
if FindFirst(root+'*.*',faAnyFile,SR) = 0 then
begin
repeat
Application.ProcessMessages;
if ((SR.Attr and faDirectory) = SR.Attr ) and (pos('.',SR.Name)=0) then
FindFilePattern(root+SR.Name,pattern)
else
begin
if pos(pattern,SR.Name)>0 then Form1.ListBox1.Items.Add(Root+SR.Name);
end;
until FindNext(SR)<>0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FindFilePattern('C:\','.exe');
end;
它正在工作,但是由于某种原因,它忽略了目录Program Files,Program Files(x86)和Users。不幸的是,我正在搜索的文件位于这些文件夹中。有人知道为什么会这样吗?
任何提示都将非常有帮助,
谢谢
就像杰里·道奇(Jerry Dodge)提到的那样,担保权无疑是您可能需要考虑的一件事。您的代码可能需要以管理员身份运行才能访问各种系统目录以及属于其他用户的目录。在大多数情况下,仅枚举您提到的目录不需要提升的权限。但是,如果您发现遇到的目录,可以执行以下任一操作:
将UAC清单添加到您的请求提升的应用程序中
将枚举代码移到单独的进程或COM对象中,然后可以在需要时从未提升的进程运行提升的代码。
但是除此之外,FindFilePattern()
您复制的过程一开始也是错误地实现的。这是:
错误地比较文件属性。(SR.Attr and faDirectory) = SR.Attr )
如果该条目是文件或目录上没有属性,则该表达式为true 。遇到具有属性的目录(例如系统目录,压缩目录,索引目录等)并不少见。
错误地比较文件名。(pos('.',SR.Name)=0)
对于根本不包含.
字符的所有文件和目录,该表达式均为true 。几乎所有文件都有一个.
,甚至目录也可以有一个.
。处理目录时,只需要专门忽略特殊条目.
和..
目录条目,而不必忽略其中的任何条目.
。
更糟糕的是,#1和#2的共同作用是将具有属性的目录和包含的目录.
视为文件而不是目录。该代码通常无法正确处理目录,更不用说递归了。
泄漏所有搜索句柄。FindClose()
如果FindFirst()
成功,必须调用,而不管FindNext()
。
尝试类似这样的方法:
uses
SysUtils, Masks;
procedure FindFilePattern(root: String; pattern: String);
var
SR: TSearchRec;
begin
root := IncludeTrailingPathDelimiter(root);
if FindFirst(root + '*.*', faAnyFile, SR) = 0 then
try
repeat
Application.ProcessMessages;
if (SR.Attr and faDirectory) <> 0 then
begin
if (SR.Name <> '.') and (Sr.Name <> '..') then
FindFilePattern(root + SR.Name, pattern);
end else
begin
if MatchesMask(SR.Name, pattern) then
Form1.ListBox1.Items.Add(Root + SR.Name);
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FindFilePattern('C:\', '*.exe');
end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句