Delphi中的文件搜索忽略了一些Windows目录

地标

我正在此线程(如何通过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。不幸的是,我正在搜索的文件位于这些文件夹中。有人知道为什么会这样吗?

任何提示都将非常有帮助,

谢谢

雷米·勒博(Remy Lebeau)

就像杰里·道奇(Jerry Dodge)提到的那样,担保权无疑是您可能需要考虑的一件事您的代码可能需要以管理员身份运行才能访问各种系统目录以及属于其他用户的目录。在大多数情况下,仅枚举您提到的目录不需要提升的权限。但是,如果您发现遇到的目录,可以执行以下任一操作:

  1. 将UAC清单添加到您的请求提升的应用程序中

  2. 将枚举代码移到单独的进程或COM对象中,然后可以在需要时从未提升的进程运行提升的代码。

但是除此之外,FindFilePattern()您复制过程一开始也是错误地实现的。这是:

  1. 错误地比较文件属性。(SR.Attr and faDirectory) = SR.Attr )如果该条目是文件或目录上没有属性,则该表达式为true 遇到具有属性的目录(例如系统目录,压缩目录,索引目录等)并不少见。

  2. 错误地比较文件名。(pos('.',SR.Name)=0)对于根本不包含.字符的所有文件和目录,该表达式均为true 几乎所有文件都有一个.,甚至目录也可以有一个.处理目录时,需要专门忽略特殊条目...目录条目,而不必忽略其中的任何条目.

  3. 更糟糕的是,#1和#2的共同作用是将具有属性的目录和包含的目录.视为文件而不是目录。该代码通常无法正确处理目录,更不用说递归了。

  4. 泄漏所有搜索句柄。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Git,忽略除子目录中的一些文件以外的所有文件

Delphi 好像忽略了我的一些代码行?

WebStorm 忽略了项目文件夹中包含的一些文件

相同的配置文件 SonarQube 忽略新实例中的一些规则

Gitignore不忽略Android库中的一些构建文件

gitignore>一些仍被忽略的文件仍添加到存储库中

通过搜索删除文件夹中的一些谷歌驱动器文件

python setup.py构建忽略一些文件

逐行读取文件,而忽略其中一些

解析時忽略一些json文件

Git忽略了一些文件的通配符添加

拉取请求,忽略一些文件更改

我可以忽略一些静态文件吗?

为什么git可以看到一些被忽略的文件?

如何从当前目录中删除一些空目录?

perl重命名:在子目录中的文件名之前添加一些内容

如何从我的目录中过滤掉一些文件?

使用NGINX仅显示目录列表中的一些文件

使用Shell脚本在目录中调用一些不规则的命名文件

使用 sed 删除目录中多个文件上的一些文本

Python:搜索一些单词并删除 .txt 文件中的整行

使用Regex C#在文本文件中搜索一些短语

如何使用 'Find' linux 命令搜索 NetCDF 文件中的一些变量?

在文本文件中搜索一些文本(如果存在),请更改“”内的文本

Gradle复制文件并仅扩展其中一些文件和/或忽略其他文件中的美元符号

如何忽略diff命令中的一些差异?

Spring - 如何忽略/重置 BindingResult 中的一些错误?

RxJava:忽略Flowable中的一些错误

在_output.yml中,一些参数被忽略