ファイルの検索

提供: Appmethod Topics
移動先: 案内検索

ファイルの操作 への移動

ファイルの検索に使用されるルーチンは 3 つあります。

  • FindFirst は、指定されたファイル名と一連の属性を持つ最初のファイルを指定のディレクトリ内で探します。
  • FindNext は、前回の FindFirst の呼び出しで指定された名前と属性に一致する次のファイルを返します。
  • FindClose は、FindFirst で割り当てられたメモリを解放します。FindFirst/FindNext のシーケンスを終了させるには、常に FindClose を使用しなければなりません。
    • ファイルが存在するかどうかを知る必要がある場合は、FileExists を使用できます。この関数は、ファイルが存在する場合は true を返し、そうでない場合は false を返します。

これら 3 つのファイル検索ルーチンでは、パラメータの 1 つとして TSearchRec を取ります。TSearchRec は、FindFirstFindNext で検索されたファイルの情報を定義したものです。TSearchRec の宣言は以下のとおりです。

Object Pascal の場合:
 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;
C++ の場合:
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 になります。

Object Pascal の場合:
 (SearchRec.Attr and faHidden > 0)
C++ の場合:
 (SearchRec.Attr & faHidden > 0)

属性定数または属性値の論理和(or)演算を行うことで、属性を組み合わせることができます。たとえば、通常のファイルに加えて読み取り専用ファイルと隠しファイルも検索するには、以下を Attr パラメータとして渡します。

Object Pascal の場合:
 (faReadOnly or faHidden).
C++ の場合:
 (faReadOnly | faHidden)

以下の例では、ラベル、[Search]ボタン、[Again]ボタンをフォームで使用しています。ユーザーが[Search]ボタンをクリックすると、指定されたパスにある最初のファイルが見つかり、そのファイルの名前とバイト数がラベルのキャプションに表示されます。ユーザーが[Again]ボタンをクリックするたびに、条件に一致した次のファイルの名前とサイズがラベルに表示されます。

Object Pascal の場合:
 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;
C++ の場合:
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);
}

メモ: クロスプラットフォーム アプリケーションやマルチデバイス アプリケーションでは、ハードコードしたすべてのパス名をシステムに合ったパス名に置き換えるか、環境変数([ツール|オプション...|環境オプション|環境変数]ページに環境変数が一覧表示)を使用して表さなければなりません。

関連項目