以前のDelphiだと、FindFirst と FindClose は以下のように書く必要がありました。
var
SRec: TSearchRec;
Found := FindFirst(FileOrFolder, Attributes, SRec);
if Found = 0 then
begin
repeat
ProcessFileOrFolder(SRec);
Found := FindNext(SRec);
until Found <> 0;
FindClose(SRec); // 見つかったときのみ CLOSE
end;
参考) FDelphiサンプル蔵
しかし、Delphi 2009では、見つからなくても、FindClose した方が良さそうです。FindClose しない場合、USBのフラッシュメモリなどの取り出しに失敗してしまいました。
SysUtils の FindFirst の近くにあるコードに従って、以下のようなコードに書き換えたら、取り出し可能になりました。
var
rec: TSearchRec;
begin
Result := 0;
if FindFirst(filename, faAnyFile, rec) = 0 then
begin
// 検索に成功した時の処理
end;
FindClose(rec);
end;
また、上記の場合、Exit で関数を抜けてしまったときなど、FindClose を忘れてしまいますから、明示的に、try .. finally .. end で括った方が閉じ忘れが無くなると思います。
var
rec: TSearchRec;
i: Integer;
begin
Result := 0;
i := FindFirst(filename, faAnyFile, rec);
try
if i = 0 then
begin
// 検索に成功した時の処理
end;
finally
FindClose(rec);
end;
end;