<h4>利用方法：</h4>
<ol>
    <li>FileMask<br />
    見つけるべき対象のファイルとそうでないファイルとを分けるフィルタ文字列を設定します。<br />
    フィルタ文字列の設定方法は Mask ユニットの TMask の記述を参照してください。</li>
    <li>Root<br />
    検索対象フォルダの最上位のフォルダを指定します。<br />
    実行の際最初に一度だけ参照されます。</li>
    <li>OnFound<br />
    ファイルが見つかった場合、サブフォルダが見つかった場合に起こるイベントです。<br />
    詳細はコメントを参考にしてください。</li>
</ol>
<pre class="brush: delphi">
unit DigDir;

interface

uses
  SysUtils, Classes, Masks;

const
  DefaultMaskStr = '*.*';

type
  /// <summary></summary>ファイル/フォルダ発見時のコールバック関数
  /// <param name="Path" />見つけたパス
  /// <param name="IsFile" />ファイルかどうか(ファイル=True)
  /// <param name="Level" />掘り進んだレベル(Root=0)
  /// <param name="DigDir" />フォルダの場合掘るかどうか
  /// <param name="Cancel" />処理中断
  TFoundEvent = procedure(const Path: string;
                          const IsFile: Boolean;
                          const Level: integer;
                          var DigDir: Boolean;
                          var Cancel: Boolean)
                          of object;

  TDigDirectory = class(TComponent)
  private
    FFileMaskStr: string;
    FFileMask: TMask;
    FRoot: string;
    FOnFound: TFoundEvent;
    /// <summary></summary>ファイル検索マスク設定
    /// <param name="Value" />マスクパターン文字列
    procedure SetFileMask(const Value: string);
    /// <summary></summary>フォルダ検索
    procedure DigDirectory(const DirPath: string; const Level: integer);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    /// <summary></summary>フォルダ検索
    procedure Execute();
  published
    /// <value></value>ファイル検索マスク文字列
    property FileMask: string read FFileMaskStr write SetFileMask;
    /// <value></value>検索ルートフォルダ
    property Root: string read FRoot write FRoot;
    /// <summary></summary>条件に一致するファイルが見つかった場合のイベント
    property OnFound: TFoundEvent read FOnFound write FOnFound;
  end;

procedure Register;

implementation

{ TDigDirectory }

constructor TDigDirectory.Create(AOwner: TComponent);
begin
  inherited;
  SetFileMask(DefaultMaskStr);
end;

destructor TDigDirectory.Destroy;
begin
  inherited;
  FreeAndNil(FFileMask);
end;

procedure TDigDirectory.Execute();
begin
  DigDirectory(FRoot, 0);
end;

procedure TDigDirectory.DigDirectory(const DirPath: string; const Level: integer);
var
  Rec: TSearchRec;
  Path: string;
  DigDir, Cancel: Boolean;
begin
  Cancel := false;

  Path := IncludeTrailingPathDelimiter(DirPath);                //  付け
  if FindFirst(Path  + '*.*', faAnyFile, Rec) = 0 then      // 初回検索
  begin
    // 見つかった
    try
      repeat
        // フォルダ発見
        if (Rec.Attr and faDirectory &gt; 0) and (Rec.Name &lt;&gt; '.') and (Rec.Name &lt;&gt; '..') then
        begin
          // 通知
          DigDir := true;
          if Assigned(FOnFound) then
            FOnFound(Path + Rec.Name, false, Level, DigDir, Cancel);
          // キャンセルの場合
          if Cancel then break;
          // さらに掘る場合
          if DigDir then DigDirectory(Path + Rec.Name, Level + 1);
        end
        // ファイル発見
        else
        if (Rec.Name &lt;&gt; '.') and (Rec.Name &lt;&gt; '..') and (FFileMask.Matches(Rec.Name)) then
        begin
          // 通知
          if Assigned(FOnFound) then
            FOnFound(Path + Rec.Name, true, Level, DigDir, Cancel);
          if Cancel then break;                             // キャンセルの場合
        end;
      until (FindNext(Rec) &lt;&gt; 0);
    finally
      FindClose(Rec);                                       // 解放
    end;
  end;
end;

procedure TDigDirectory.SetFileMask(const Value: string);
var
  NewMaskStr: String;
  OldMask: TMask;
begin
  if (Value = '') then
    NewMaskStr := DefaultMaskStr
  else
    NewMaskStr := Value;
  if (FFileMaskStr = NewMaskStr) then exit;

  OldMask := FFileMask;
  try
    FFileMask := TMask.Create(NewMaskStr);
    FFileMaskStr := NewMaskStr;
  except
    FFileMask := OldMask;
  end;
end;

procedure Register;
begin
  RegisterComponents('Black Cat', [TDigDirectory]);
end;

end.
</pre>