delphi 遞歸的方法


關於遞歸,我個人有個膚淺的認識,就是在函數或者過程中調用自身。
比如下面的代碼,用遞歸的方法遍歷磁盤文件,找到QQ.exe然后刪掉。

 

procedure FindFile(Dir: String);                         // 自定義過程;
var
  Str: TSearchRec;            // 是delphi為我們定義好的一個記錄類型。 用於記錄文件的各個參數,比如大小,屬性,文件名等等;
  Path: string;
begin
  Path := extractfilepath(Dir);      //  利用 ExtractFilePath函數 將文件的路徑轉為絕對路徑然后復制給Path;
  if FindFirst(Dir, faAnyFile, Str) = 0 then           // FindFirst 是一個查找文件函數(查找第一個符合參數文件)里面有三個參數,(路徑與文件后綴(C:\*.*) , 文件類型, TSearchRec類型變量(用於儲存文件的參數)) , 函數如果找到了文件返回值便是0,否則返回值便是錯誤指令;
   

while FindNext(Str) = 0 do                  // FindNext是和FindFirst連着用的,FindFirst是查找第一個,FindNext則是查找下一個。 (返回值和FindFirst一樣的);
      if (Str.Name <> '.') and (Str.Name <> '..') and (Str.Name = 'QQ.exe') then    //這句就很明顯了。在上面連個函數的執行過程中就已經把找到的文件的參數賦值給Str變量了。 而這句話的意思也就是剔除自身文件夾,與父文件夾。並且還要是QQ.exe
      begin
        DeleteFile(Path + Str.Name);  // 如果符合IF的條件,就刪掉QQ.exe ;
        FindClose(Str);             // 退出查找,並釋放所占的內存。參數還是TSearchRec類型變量;
      end
      else if (Str.Name <> '.') and (Str.Name <> '..') and            
        ((FileGetAttr(Path + Str.Name)) = faDirectory) then       //這里就是進入遞歸的地方了。 同樣是排除父文件夾與自身,然后再判斷當前文件是不是文件夾;
        FindFile(Path + Str.Name + '\*.*');                 // 如果符合了上面的條件,那就再調用自身,進行運算, 執行這一句之后就會跳到 begin處執行 反復循環。
end;

   注 : 執行上面的代碼后就會在某個磁盤下查找QQ.exe 如果進入了遞歸之后你會發現在一個文件夾下如果沒有QQ.exe程序自動會回到上一級目錄中去。

 比如這個目錄d:\A\B,即A,B文件夾下都有文件,調用FindFile('d:\A\*.*')時
   可能FindFirst先找到了B文件夾,即符合遞歸條件再次調用FindFile('d:\A\B\*.*'),
   從而進入到B目錄查找(A目錄查找還未結束),待B目錄查找結束后,會返回到A目錄繼續之前的動作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM