フォルダだけ検索したいのに・・FindFirstについて

ファイルやフォルダを検索する関数に、FindFirstがあります。

FindFirstで条件を指定して、FindNextで次々に検索していき、FindCloseで検索終了(必ず必要です!) という流れになります。

しかし・・・

FindFirst("C:\",faDirectory,sr);

とやるとなぜかフォルダ以外のファイルも検索されてしまいます。

じつはFindFirstの2つ目の引数は「通常ファイル以外にも検索したいファイルがあったら追加する」 というものです。別に指定した種類だけを検索してくれるわけではありません。 ですので検索後にif文などで判別する必要があります。

集合型にある要素が含まれているかどうかを調べるには、集合演算子inを使います。

そしてさらに、各フォルダ内には「.」というファイルと「..」というファイルが 密かに存在していますのでこの2つを除く必要があります。

if (sr.Attr in [faDirectory]) and (sr.Name <> '.') and (sr.Name <> '..') then begin
  処理
end; 

例として、フォルダ内のフォルダ数をカウントする方法を載せます。

//----------------------------------------------------------------
// フォルダ内のフォルダ数をカウントする(サブフォルダは含めません)
//----------------------------------------------------------------

var
  sr:TSearchRec;
  countFolder:integer;
bagin
  //Cドライブ直下にあるフォルダ数を数える
  if FindFirst('C:\*.*',faDirectory,sr) = 0 then begin
    repeat
      if (sr.Attr in [faDirectory]) and (sr.Name <> '.') and (sr.Name <> '..') then
        countFolder := countFolder + 1;
    until FindNext(sr) <> 0;
  end;
end;

戻る