ファイルの検索
ファイルの操作 への移動
ファイルの検索に使用されるルーチンは 3 つあります。
- FindFirst は、指定されたファイル名と一連の属性を持つ最初のファイルを指定のディレクトリ内で探します。
- FindNext は、前回の FindFirst の呼び出しで指定された名前と属性に一致する次のファイルを返します。
- FindClose は、FindFirst で割り当てられたメモリを解放します。FindFirst/FindNext のシーケンスを終了させるには、常に FindClose を使用しなければなりません。
- ファイルが存在するかどうかを知る必要がある場合は、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 型パラメータの各フィールドに格納されます。TSearchRec のフィールドの中で特に重要なものは Attr フィールドです。Attr を以下の属性定数または属性値と照合すれば、ファイルが特定の属性を持っているかどうかがわかります。
属性定数と属性値
定数 | 値 | 説明 |
---|---|---|
faReadOnly |
$00000001 |
読み取り専用ファイル |
faHidden |
$00000002 |
隠しファイル |
faSysFile |
$00000004 |
システム ファイル |
faVolumeID |
$00000008 |
ボリューム ID ファイル |
faDirectory |
$00000010 |
ディレクトリ ファイル |
faArchive |
$00000020 |
アーカイブ ファイル |
faAnyFile |
$0000003F |
すべてのファイル |
ファイルが特定の属性を持っているかどうかを調べるには、and 演算子を使って、Attr フィールド値と属性定数の論理積演算を行います。ファイルがその属性を持っている場合、演算結果は 0 より大きい値になります。たとえば、見つかったファイルが隠しファイルの場合、以下の式の評価結果は True になります。
(SearchRec.Attr and faHidden > 0)
(SearchRec.Attr & faHidden > 0)
属性定数または属性値の論理和(or)演算を行うことで、属性を組み合わせることができます。たとえば、通常のファイルに加えて読み取り専用ファイルと隠しファイルも検索するには、以下を Attr パラメータとして渡します。
(faReadOnly or faHidden).
(faReadOnly | faHidden)
例
以下の例では、ラベル、[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\\bcb6\\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);
}
メモ: クロスプラットフォーム アプリケーションやマルチデバイス アプリケーションでは、ハードコードしたすべてのパス名をシステムに合ったパス名に置き換えるか、環境変数([ツール|オプション...|環境オプション|環境変数]ページに環境変数が一覧表示)を使用して表さなければなりません。