以前の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;