FreeBASIC Dir
目次→実行時ライブラリー参考→オペレーティング・システム関連→DIR←オリジナル・サイト
ファイルシステム内の項目に関する情報を検索して返します。
ディレクトリ(フォルダ)属性検索を実行します。
構文:
用法:
result = Dir( item_spec, [ attrib_mask ], out_attrib )
result = Dir( item_spec [, [ attrib_mask ] [, p_out_attrib ] ] )
result = Dir( out_attrib )
result = Dir( [ p_out_attrib ] )
パラメタ:
item_spec
項目の名前を合わせるパターン。
attrib_mask
項目の属性を合わせる、ビット・マスク。
out_attrib
見つけたそれぞれの項目の属性が割り当てられる、ビット・マスクへの参照。もしあれば。
p_out_attrib
見つけたそれぞれの項目の属性が割り当てられる、ビット・マスクのポインタ。もしあれば。
戻り値:
名前 item_spec か、属性マスク attrib_mask に合致する項目がなかったなら、out_attrib (あるいは *p_out_attrib) は、ゼロになります。そして、空の文字列が返ります。
合致すれば、out_attrib (あるいは *p_out_attrib) は、項目の属性マスクが割り当てられます。そして、項目名が、経路なしで、返されます。
記述:
Dir は、引数として渡された
item_spec に一致する、最初のファイル・システム項目を返します。
この
item_spec パターンに一致する次のファイル項目を取得するには、この引数なし(または空の文字列を指定)で、
Dir をもう一度呼び出します。
そのため、ディレクトリ内の項目のリストを取得するには、
Dir を複数回呼び出して、呼び出し毎に1つの項目を返す必要があります。
item_spec が、絶対パスを含んでいる場合、最初の手続きは、ファイル・システムを対策して、
item_spec という名前に一致し、その属性がすべて
attrib_mask に含まれている項目を見つけます。
絶対パスを含まない場合は、現在のディレクトリを基準にして検索します(
CurDirを参照)。
探した結果、一致する項目が見つからない場合、
out_attrib はゼロに割り当てられ、空の文字列が返されます。
合致する項目が見つかれば、
out_attrib に項目の属性フラグが代入され、パスなしの項目の名前が返されます。
item_spec には、アスタリスク(
*、連続する任意の文字(文字列)と一致)または、1つ以上の疑問符(
?、任意の個別の文字と一致)を含めることができます。
存在した場合、手続きはその最初の項目を検索します。
合致する項目が見つかった場合、
item_spec が省略されているか空の文字列なので、項目が見つからなくなるまで、名前
item_spec の次の項目を返します。
attrib_mask で、この後続の呼び出しを省略している場合、手続きは前の呼び出しと同じ属性を持つ項目を検索します。
2番目の構文は、Dir( item_spec, attrib_mask, *p_out_attrib ) と同じように振る舞います。
3番目の構文は、Dir( "", , out_attrib ) と同じように振る舞います。
4番目の構文は、Dir( "", , *p_out_attrib ) と同じように振る舞います。
ファイル属性:
ファイル、ディレクトリ、その他の項目は、ファイル属性を持っています。ファイル属性とは、項目について説明するメタデータです。
このメタデータの意味は、使用するオペレーティング・システムとファイル・システムによって異なります。
次の定義済み定数は、
attrib_mask および
out_attrib または
*p_out_attrib で、ビットフラグとして使われます。
これらの値は、
Operator Or を使って、組み合わせて、マスクを形成できます。
これらの値は、返されたファイルが持つことを
許されているメタデータです。
定義されたフラグにアクセスするには、
#Include "dir.bi" か、
include "
vbcompat.biが必要です。
ここで「ファイル」は任意のファイルシステムエントリで、通常のファイル、ディレクトリなどを意味していてます。
attrib_mask は、返されるファイル名に許可されるファイル属性のセットを指定します(
attrib_mask で指定されていない属性がファイルにある場合、返されるファイル名から除外されます)。
例えば:
fbDirectory はディレクトリ属性が設定されていないものだけを許可します。他の属性が設定されていないファイルまたはディレクトリだけが合致することを意味します。
(fbReadOnly Or fbDirectory) は、読み取り専用のディレクトリ(フォルダ)とファイル、および書き込み可能なディレクトリ(フォルダ)とファイルを許可します。
fbArchive Or fbDirectory は、アーカイブされたファイル、アーカイブされたディレクトリ、アーカイブされていないファイル、アーカイブされていないディレクトリに対してマッチします (たとえば、読み取り専用ファイルに対してはマッチしません)。
論理条件:
等式 '((attrib_mask) OR (file_attrib)) = (attrib_mask)' が真ならば DIR によって返されるファイル名。
あるいは
((file_attrib) AND (Not attrib_mask)) = 0 の場合、 DIR によって返されるファイル名。
演算子 And を使って、out_attrib で返された 特定のフラグをチェックすることにより、より強力なフィルタリングを実行できます。
# define fbReadOnly &h01
項目は、書いたり、削除したりできません。
DOS と Windows: 項目は、"read-only" 属性を持ちます。
Linux:項目は、現在のユーザやグループに関連して、書き込み許可がありません。また、グローバルにも、書き込み不可です。
(ユーザに、ルート許容があろうが無かろうが、無視されます。)
# define fbHidden &h02
項目は、普通のディレクトリ・リストで、隠されます。
DOS と Windows: 項目は、"hidden" 属性を持ちます。
Linux: 項目の名前は、先頭文字として、ピリオド (.) があります。
# define fbSystem &h04
項目は、専らシステムによって使用されます。
DOS と Windows: 項目は、"system" 属性を持ちます。
Linux: 項目は、キャラクタ・デバイス、ブロック・デバイス、名前付きパイプ(先入れ先出し法)、または Unix ソケット、のいずれかです。
# define fbDirectory &h10
項目は、ディレクトリです。
現在の (.) 、そして、親の (..) ディレクトリを含んでいます。
DOS と Windows と Linux: 項目は、ディレクトリです。
# define fbArchive &h20
項目は、いくつかの自動操作の後、バックアップされるかもしれません。
DOS と Windows: 項目は、"archive" 属性を持っています。 (自動的に、ファイルへのすべての書き込みアクセス後に、設定)
Linux: 項目は、ディレクトリではありません。
一般的なファイルシステムは、このメタデータをサポートしません。
# define fbNormal (fbReadOnly or fbArchive)
項目は、読み取り専用か "archived" です。
(attrib_mask が、fbArchiveを含まないなら、Dir は、fbDirectory を含むためにチェックを広げます。
しかし、それが期待される動作なら、明示的に fbDirectory を加えることを推奨します。)
attrib_mask の値に関係なく、属性がないと見られる項目は、常にマッチされます。
項目に、attrib_mask で指定されていない一つ以上の属性があるならば、項目はマッチされません。
一般に、attrib_mask を使って、あるセットを持つファイル/フォルダーを除外しているとき、別のセットの属性を持つファイル/フォルダーを含めることはできません。
たとえば、読み取り専用ファイルを除外している間は、読み取り専用ディレクトリをスキャンすることはできません(ファイルに他の属性も含まれている場合を除く)。
目的の属性セットの out_attrib 値をチェックすると、より細かく制御できます。
例1:
' 現在のディレクトリ内のファイルの数。
Dim As Integer FileCount
If Dir("*") <> "" Then ' filespec/attrib を指定せずにファイル検索を開始し、最初のファイル名を取得します。
Filecount = 1
While Dir() <> "" ' dir()が "" の場合、ループを終了します。これ以上、読み取るファイル名がありません。
FileCount += 1 ' ファイル数のカウンターを加える
Wend
End If
Print FileCount & " ←現在のフォルダ内のファイル数"
Sleep
例2:
#include
"dir.bi" 'attrib_mask パラメタに使う定数を提供します
Sub list_files
(ByRef filespec
As String,
ByVal attrib
As Integer)
Dim As String filename =
Dir(filespec, attrib
) ' 最初のファイル名を得る、指定された filespec/attrib *AND* で、ファイル検索を始めます。
Do While Len(filename
) >
0 ' len(ファイル名) が 0 なら、ループを出ます: これ以上のファイル名は読まれるために残りません。
Print filename
filename =
Dir() ' 最初に指定された filespec/attrib に一致する次の項目を検索します(そして取得します)。
Loop
End Sub
Print "フォルダ:"
list_files
"*", fbDirectory
Print
Print "何かキー入力すると表示します。"
Print "archive files:"
Sleep
list_files
"*", fbArchive
Sleep
例3:
'' show any files that have directory attribute and don't care if it is system, hidden, read-only, or archive
'' ディレクトリ属性を持つ全て(フォルダー)を表示します。システム、非表示、読み取り専用、アーカイブを問わいません。
#include once "dir.bi"
'' allow everything
'' すべてを許可する
Var mask = fbDirectory Or fbHidden Or fbSystem Or fbArchive Or fbReadOnly
Var attrib = 0
Var f = Dir( "*.*", mask, attrib )
While( f > "" )
'' show any files that have at least a directory attribute
'' 少なくともディレクトリ属性を持つファイルを表示する
If( attrib And fbDirectory ) Then
Print f
End If
f = Dir( attrib )
Wend
Sleep
例4:
'' DIR 関数を使して、属性を検索する例
#include
"dir.bi" '' 属性を合わせる定数を提供します
'' 入力属性マスクに、正常で、隠しで、システムかディレクトリのファイルを許容するように、設定します。
Const attrib_mask = fbNormal
Or fbHidden
Or fbSystem
Or fbDirectory
' = &h37
Dim As UInteger out_attr
'' 検索された属性を保持する、符号無しの整数
Dim As String fname
'' 戻りの file/directory 名
Dim As Integer filecount, dircount
fname =
Dir("*.*", attrib_mask, out_attr
) '' 最初の ファイル名/属性を取得します。供給されたファイル仕様と属性マスクに従います
Print "このフォルダのファイル名と属性を表示します " &
CurDir &
":"
Print "何かキー入力して下さい。"
Sleep
Do Until Len(fname
) =
0 '' Dir が、空の文字列を返すまで、繰り返します
If (fname <>
".") And (fname <>
"..") Then '' 現在と親ディレクトリ登録を無視します
Print fname,
If (out_attr
And fbDirectory
) <>
0 Then
Print "- directory";
dircount +=
1
Else
Print "- file";
filecount +=
1
End If
If (out_attr
And fbReadOnly
) <>
0 Then Print ", read-only";
If (out_attr
And fbHidden
) <>
0 Then Print ", hidden";
If (out_attr
And fbSystem
) <>
0 Then Print ", system";
If (out_attr
And fbArchive
) <>
0 Then Print ", archived";
Print
End If
fname =
Dir(out_attr
) '' 次の名前/属性を見つけます
Loop
Print
Print "見つけたものは " & filecount &
" 個のファイルと、 " & dircount &
" 個のサブ・ディレクトリーです。"
Sleep
プラットホーム差:
- Linux は、filename が、実際のファイル名と、大文字・小文字を含めて合致する必要があります。
Windows と DOS は、大文字・小文字を区別しません。
- Linux の経路分離符は、前方スラッシュ / です。Windows は、後方スラッシュ \ を使いますが、前方スラッシュも使えます。
DOS は、後方スラッシュ \ を使用します。
- DOSでは、属性マスク値 &h37 (通常 &h3F も使えます。しかし &h37 が確実です) は、すべてのファイルとディレクトリを返します。"." と ".."を含んでいます。
しかし、Volume は含まれません。:
値 8 は、Volumeを返します。現在のディレクトリが、主なディレクトリでなくてもです。
方言差:
- -lang qb 方言では、別名__Dirと共に参照をつけない場合、利用できません。
QBからの違い:
- QBasic で差異はありません。Visual Basic で、差異があります。
out_attrib パラメタは、FreeBASICで新規作成。
参照:
ページ歴史:2022-07-05 08:47:11
日本語翻訳:WATANABE Makoto、原文著作者:SysOp