FindFirstとFindNextルーチンを利用すると、
指定されたフォルダ内にあるファイルをその名前で検索することができます。
例えば、あるフォルダにあるファイルを順番に読み込み、
そのファイルに対して処理を行いたい場合を考えてみましょう。
ファイル名ではワイルドカード文字も使用できますので、
「MGで始まるCSVファイル」といった指定も「MG*.CSV」として行えます。
具体的には、まずFindFirstで特定のフォルダ内にある指定された属性を持つファイル名の
最初のインスタンスを検索し、FindNextで次々と検索を行います。
そして最後にFindCloseを実行し、FindFirst によって割り当てられたメモリを解放します。
FindFirstとFindNextで、TSearchRec型で定義された変数にファイルの情報がセットされます。
<TSearchRec型が保持するファイル情報>
- Time … ファイルの更新日時。FileDateToDateTime関数を使ってTDateTime値に変換できます。
※コンパイルできない場合はTimeStampプロパティを使用 - Size … ファイルのサイズ(バイト単位)。
- Attr … ファイルの属性。(設定値の詳細仕様はDocwikiを参照)
- Name … ファイル名(拡張子を含む)。
- ExcludeAttr … Attrに対する除外属性を指定する際に使用します。
- FindHandle … 検索の状態をトラッキングするための内部ハンドル。
- FindData … ファイル作成時刻、最終アクセス時刻、長いファイル名と短いファイル名などの追加情報を格納。
TSearchRec型は上記の情報を持ちますので、例えば変数が「SR」のときには、
ファイル名はSR.Name、更新日時はSR.Timeでアクセスできます。
{*******************************************************************************
目的: 対象ボタン押下時処理
引数:
戻値:
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
SR : TSearchRec;
FND : Integer;
begin
// フォルダ「C:\csv」にあるファイル「MG*.csv」を検索
FND := FindFirst('C:\csv\MG*.CSV', FaAnyFile, SR);
while FND = 0 do
begin
// ファイル名SR.Nameを利用しここに処理を記述
// (例) ShowMessage(SR.Name);
// ・・・
// 次のファイルを検索
FND := FindNext(SR);
end;
FindClose(SR);
end;
変数SR(TSearchRec型)には1ファイルの情報がセットされますが、
FindFirst関数で最初のファイル、FindNext関数で次のファイルへと移っていきますので、
SRが持つ情報がファイルごとに変わっていきます。
また変数FND(Integer型)には、
FindFirst、FindNext関数でファイルが見つかれば「0」が入りますので
「0」でなくなるまで処理を繰り返します。
<補足>
System.IOUtilsユニットの「TDirectory」を使った方法でも
ファイル名一覧は取得できますが、V2010以降でのみ使用可能となります。
今回の方法は過去のバージョンでも利用可能です。
また、TDirectoryではファイル単位の属性の取得ができません。
(ミガロ.情報マガジン「MIGARO News!!」Vol.077 2007年6月号より)