VBのDIR関数って使い辛くって・・・・
DIR関数は私の想像ですが、VBが内部でAPI関数
FindFirstFile
FindNextFile
FindClose
を呼んでいると思えます。
これらはファイルハンドルを取得する仕様なのですが、VBはそのファイルハンドルの記憶領域を一つしか存在していないようなので、DIR関数だけでのプログラムでは面倒なような気がします。
DIR関数の仕様は
最初に「Dir(ファイル,属性)」
2回目以降「Dir」
で次々にヒットするファイル名を取得しますよね?
下のような構造のとき
\Dir1
├\Dir1_1
│ ├File1_1.txt
│ ├File1_2.txt
│ └File1_3.txt
├\Dir1_2
│ ├File2_1.txt
│ ├File2_2.txt
│ └File2_3.txt
├\Dir1_3
│ ├File3_1.txt
│ ├File3_2.txt
│ └File3_3.txt
├File1.txt
├File2.txt
└File3.txt
途中でフォルダチェンジの為にDir(ファイル,属性)を使用したら、使用する前のDir位置を記憶していません。(わかりづらい説明ですが・・・)
要は再起法が使用できないという欠点があります。
私の場合なら、
1.APIで全て組む(ファイルハンドルを独自で記憶領域を設ける)
2.VBオブジェクトのファイルリストボックス・ドライブリストボックスを使用する
3.ファイルシステムオブジェクト(FSO)を(不本意ですが)使用する
という3つが思いつきます。
ちなみに3の方法は、WIN95でIE3以下の環境OSでは使用できないと思われます。
私のライブラリにFSOサンプルとして使えそうなものがあったので、改造して張っておきます。チェックロジックはもっと効率的な方法があると思いますので、独自で改造してください。
※要「参照設定」→「Microsoft Scripting Runtime」
Private Sub Command1_Click()
List1.Clear
'検索条件をチェック(チェックロジックはもっと厳しくした方がよいですね)
If Text1.Text > Text2.Text Then
MsgBox "範囲指定が不正"
GoTo PGMERR
End If
'ファイル一覧を作成(初期検索位置を指定)
Call addFileList("C:\Program Files\Microsoft Visual Studio\VB98")
PGMEND:
Exit Sub
PGMERR:
End Sub
Private Sub Form_Load()
With Me
.Text1.Text = ""
.Text2.Text = ""
.List1.Clear
.Command1.Caption = "検索実行"
End With
End Sub
'ファイル一覧を作成
Private Sub addFileList(inDir As String)
Dim fsoObj As FileSystemObject
Dim fsoDir As Folder
Dim fsoDirWk As Folder
Dim fsoFile As File
Dim blnFlg As Boolean
'FSOを作成
Set fsoObj = New FileSystemObject
'DIRパスをセット
On Error Resume Next
Set fsoDir = fsoObj.GetFolder(inDir)
On Error GoTo 0
'DIR取得失敗
If fsoDir Is Nothing Then
MsgBox inDir & " なんて無いYO-"
GoTo PGMEND
End If
'DIR内部のファイルを取得
For Each fsoFile In fsoDir.Files
'範囲内にあるかチェック
'範囲指定だけでなく、Like演算子を使用して、「含むチェック」をしたいならここでできる
blnFlg = True
If Text1.Text <> "" Then
If Text1.Text > fsoFile.Name Then
blnFlg = False
End If
End If
If Text2.Text <> "" Then
If Text2.Text < fsoFile.Name Then
blnFlg = False
End If
End If
'範囲チェックが正常ならリストに追加
If blnFlg Then
List1.AddItem fsoFile.Path
End If
Next fsoFile
'DIR内部のサブフォルダのファイル一覧を取得
For Each fsoDirWk In fsoDir.SubFolders
Call addFileList(fsoDirWk.Path)
Next fsoDirWk
PGMEND:
End Sub
お礼
DIR関数を使わないでFSOを使ってやってみたところ、できました!! ありがとうございましたm(__)m