簡體   English   中英

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

[英]File search in Delphi is ignoring some Windows directories

我正在此線程( 如何通過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)提到的那樣,擔保權無疑是您可能需要考慮的一件事。 您的代碼可能需要以管理員身份運行才能訪問各種系統目錄以及屬於其他用戶的目錄。 在大多數情況下,僅枚舉您提到的目錄不需要提升的權限。 但是,如果您發現遇到的目錄,可以執行以下任一操作:

  1. 將UAC清單添加到要求提升的應用程序中

  2. 將枚舉代碼移到單獨的進程或COM對象中,然后可以在需要時從未提升的進程運行提升的代碼。

但是除此之外,您復制的FindFilePattern()過程一開始也是錯誤地實現的。 它是:

  1. 錯誤地比較文件屬性。 如果條目是文件或目錄上沒有屬性 ,則表達式(SR.Attr and faDirectory) = SR.Attr )將為true。 遇到具有屬性的目錄(例如系統目錄,壓縮目錄,索引目錄等)並不少見。

  2. 錯誤地比較文件名。 對於不包含的所有文件和目錄,表達式(pos('.',SR.Name)=0)將為true . 完全沒有個性。 幾乎所有文件都有一個. ,甚至目錄也可以有一個. 也一樣 處理目錄時,您需要忽略special即可. ..目錄條目,而不是任何帶有. 在里面。

  3. 更糟糕的是,#1和#2的共同作用是允許具有屬性的目錄和包含的目錄. ,被視為文件而不是目錄。 該代碼通常無法正確處理目錄,更不用說遞歸了。

  4. 泄漏所有搜索句柄。 無論FindNext()如何,如果FindFirst()成功,則必須調用FindClose() 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;

您的應用程序需要以提升的特權運行,才能訪問您所說的子目錄中的某些子目錄。 作為臨時測試,運行“以管理員身份”進行驗證。 如果確實如此,則應添加清單以在啟動時要求提升。

Delphi的更高版本具有此內置功能。 在“項目選項”下,轉到“應用程序”頁面,然后選中“啟用管理員權限”。 當然,這是使用IDE的快速簡便的方法,您應該考慮編寫自己的自定義清單,尤其是在運行沒有此選項的較舊版本的Delphi時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM