ファイルの検索を行うシステムコールを紹介します。検索といっても、どのディレクトリに
あるかどうかを調べるものではありません。カレントディレクトリもしくは指定したディレクトリに
指定したファイルがあるかどうかを調べるものです。ファイル名の指定にはワイルドカードが
使えます。
ワイルドカードとは、「*」「?」のことで、「*」は任意の0文字以上の文字(列)、「?」は
任意の1文字に置き換えられます。すなわち「ABC*.TXT」は、「ABC.TXT」、「ABCD.TXT」などが
当てはまります。「ABC?.TXT」は「ABC.TXT」は当てはまりません。また、「*.*」 とすれば
すべてのファイルが当てはまります。
最初に一致するファイル名の検索
AH = 4Eh
DS:DX = 探すファイル名の格納アドレス
CX = ファイル属性(詳細はこちら)
INT 21h
戻り値:CF = 0 のとき
正常に実行された
:CF = 1 のとき
AX = 02h DS:DXで指定したパスが無効
AX = 12h 該当するファイルは存在しない
|
ファイル属性についてはすでに解説した。ここで指定する
ファイル属性は特別なファイルを検索する場合にのみ使用する。すなわち「dir」コマンドで
通常表示されないファイルの検索を行う場合で、具体的には「システムファイル」、
「隠しファイル」そしてディレクトリを指します。「リードオンリー」、「アーカイブ」
属性のファイルは特に指定しなくても勝手に探し出してくれます。
すなわち、通常のファイル、リードオンリーファイルのみを探したい場合は、
CX=0で構いません。システムファイル、隠しファイルも検索したい場合は、CX=6を
ディレクトリのみ検索したい場合はCX=10h、すべて検索したい場合はCX=16hを指定します。
検索し、指定のファイルを見つけた場合にはDTAという領域に、
ファイル名などの情報が書き込まれます。DTAは標準ではPSPの
80h番地から始まっています。またDTAはプログラマーが設定したり、取得したりすることも
可能です。(詳細はこちら)
DTAの1Eh番地からASCIIZ文字でファイル名が格納されていますので、これを利用して
ファイルをオープンしたり処理を行うことができます。また、DTAの16h番地にファイルの
時刻、18h番地にファイルの日付が格納されています。
ワイルドカードを使用した場合、該当するファイルが複数あっても1つしか情報は
得られません。どの順番に得られるかは解説するのが難しいので、ここでは不定と覚えて
おいてください。そして、複数該当するファイルがあり、次のファイルの情報が得たい場合は
次のシステムコールを使用します。
次に一致するファイル名の検索
AH = 4Fh
INT 21h
戻り値:CF = 0 のとき
正常に設定できた
:CF = 1 のとき
AX = 12h 該当するファイルは存在しない
|