■フォルダだけ検索したいのに・・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;