ファイルの検索
RTL の利用:インデックス への移動
ファイル検索用には,3 つのルーチン FindFirst,FindNext,および FindClose があります。FindFirst は,指定されたディレクトリ内で,与えられた属性を持つファイル名の最初のインスタンスを検索します。FindNext は,FindFirst を呼び出したときに指定した名前と属性に一致する次のエントリを返します。FindClose は FindFirst によって割り当てられたメモリを解放します。常に FindClose を使って FindFirst/FindNext シーケンスを終了する必要があります。ファイルが存在するかどうか知りたい場合には,FileExists 関数を使用できます。この関数は,ファイルが存在する場合には True を返し,存在しない場合には False を返します。
3 つのファイル検索ルーチンは,パラメータの 1 つとして TSearchRec をとります。TSearchRec は,FindFirst や FindNext が検索するファイル情報を定義します。ファイルが見つかると,TSearchRec 型パラメータのフィールドが変更されて見つかったファイルを示します。
type TFileName = string; TSearchRec = record Time: Integer;//Time にはファイルのタイムスタンプが格納されます。 Size: Integer;//Size にはファイルサイズがバイト単位で格納されます。 Attr: Integer;//Attr はファイル属性を表します。 Name: TFileName;//Name にはファイル名と拡張子が入っている ExcludeAttr: Integer; FindHandle: THandle; FindData: TWin32FindData;//FindData には,ファイル作成時刻,最終アクセス時刻, //長いファイル名と短いファイル名などの追加の情報が入っている end;
struct TSearchRec { int Time; // ファイルのタイムスタンプ int Size; // ファイルのサイズ(バイト単位)。 int Attr; // ファイルの属性フラグ AnsiString Name; // ファイル名と拡張子 int ExcludeAttr; // 無視するファイルの属性フラグ unsigned FindHandle; _WIN32_FIND_DATAA FindData; // 追加情報を含む構造体 } ;
TSearchRec のフィールドの中で特に有用なのは,Attr フィールドです。以下の属性定数または値に対して Attr をチェックして,ファイルが特定の属性を持っているかどうかを判別できます。
属性定数と値 :
| 定数 | 値 | 説明 |
|---|---|---|
|
faReadOnly |
$00000001 |
読み出し専用ファイル |
|
faHidden |
$00000002 |
非表示ファイル |
|
faSysFile |
$00000004 |
システムファイル |
|
faVolumeID |
$00000008 |
ボリュームファイル |
|
faDirectory |
$00000010 |
ディレクトリファイル |
|
faArchive |
$00000020 |
アーカイブファイル |
|
faAnyFile |
$0000003F |
すべてのファイル |
属性を調べるには,Attr フィールドの値と属性定数の and をとります。ファイルがその属性を持つ場合,結果は 0 より大きくなります。たとえば,見つかったファイルが非表示ファイルの場合,次の式の評価結果は True になります。
(SearchRec.Attr and faHidden > 0).
(SearchRec.Attr & faHidden > 0).
定数または値を OR で結ぶことにより,属性を複数指定できます。たとえば,通常ファイル以外に読み出し専用ファイルと非表示ファイルを検索するには,Attr パラメータに次のものを渡します。
(faReadOnly or faHidden).
(faReadOnly | faHidden).
以下に,この 3 つのファイル検索用ルーチンの使用例を示します。この例では,フォーム上のラベル,[Search]ボタン,[Again]ボタンを使用します。ユーザーが[Search]ボタンをクリックすると,指定されたパス上の最初のファイルが検索され,ファイル名とバイト数がラベルの見出しに表示されます。ユーザーが[Again]ボタンを押すたびに,次に一致するファイル名とサイズがラベルに表示されます。
var SearchRec: TSearchRec; procedure TForm1.SearchClick(Sender: TObject); begin FindFirst('c:\Program Files\MyProgram\bin\ *.*', faAnyFile, SearchRec); Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + " bytes in size'; end; procedure TForm1.AgainClick(Sender: TObject); begin if FindNext(SearchRec) = 0 then Label1.Caption := SearchRec.Name + ' is ' + IntToStr(SearchRec.Size) + ' bytes in size' else FindClose(SearchRec); end;
TSearchRec SearchRec; // グローバル変数 void __fastcall TForm1::SearchClick(TObject *Sender) { FindFirst("c:\\Program Files\\MyProgram\\bin\\ *.*", faAnyFile, SearchRec); Label1->Caption = SearchRec->Name + " is " + IntToStr(SearchRec.Size) + " bytes in size"; } void __fastcall TForm1::AgainClick(TObject *Sender) { if (FindNext(SearchRec) == 0) Label1->Caption = SearchRec->Name + " is " + IntToStr(SearchRec.Size) + " bytes in size"; else FindClose(SearchRec); }