關於遞歸,我個人有個膚淺的認識,就是在函數或者過程中調用自身。
比如下面的代碼,用遞歸的方法遍歷磁盤文件,找到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目錄繼續之前的動作