遞歸函數實例: 搜索當前目錄下的所有嵌套目錄

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//列出一個目錄下所有目錄(包括嵌套)的函數
procedure GetDirs(dirName: string; List: TStrings);
var
  SRec: TSearchRec;            {定義 TSearchRec 結構變量}
  dir: string;
const
  attr: Integer = faDirectory; {文件屬性常量, 表示這是文件夾}
begin
  dirName := ExcludeTrailingBackslash(dirName) + '/'; {不知道最後是不是 /; 先去掉, 再加上}
  dir := dirName + '*.*'; {加上 /; *.* 或 * 表示所有文件, 系統會把目錄也當作一個文件}

  if FindFirst(dir, attr, SRec) = 0 then {開始搜索,並給 SRec 賦予信息, 返回0表示找到第一個}
  begin
    repeat
      if (SRec.Attr = attr) and              {如果是文件夾}
         (SRec.Name <> '.') and              {排除上層目錄}
         (SRec.Name <> '..') then            {排除根目錄}
       begin
         List.Add(dirName + SRec.Name);      {用List記下結果}
         GetDirs(dirName + SRec.Name, List); {這句就是遞歸調用, 如果沒有這句, 只能搜索當前目錄}
       end;
    until(FindNext(SRec)<>0);                {找下一個, 返回0表示找到}
  end;

  FindClose(SRec);                           {結束搜索}
end;



{測試}
procedure TForm1.Button1Click(Sender: TObject);
var
  list: TStrings;
begin
  list := TStringList.Create;

  GetDirs('C:/Downloads', list);
  Memo1.Lines := list;

  list.Free;
end;

end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章