• ベストアンサー

フォルダの検索2

先日質問させていただいたのですが・・・。その続きです。 今度は範囲指定でフォルダの検索をしたいのです。 例えば、下記のようなフォルダがあったとします。 No1--- 200209190951 - ファイル     |- 200209191000 - ファイル     |- 200209201000 - ファイル ←○    |- 200209211000 - ファイル ←○    |- 200209221000 - ファイル ←○ ユーザより検索したいフォルダを選択してもらうとして、 『No1』『20020920以上の全てのフォルダ』と条件を指定してもらったとして、 ○のフォルダ内のファイルを参照したいのですが・・・。 なかなか、よい方法が思いつかず、なにかあれば教えてくださいm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

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

snowsaab
質問者

お礼

DIR関数を使わないでFSOを使ってやってみたところ、できました!! ありがとうございましたm(__)m

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

>NO1というフォルダの中にサブフォルダ(この例でいうと『200209201000』など)が存在するかどうか、というのは調べられるのでしょうか? dr = dir("d:\Test\No1\20020920100",16) でフォルダがあれば、dr = "20020920100"、なければ dr = "" になりますのでそれで判断できます。

snowsaab
質問者

お礼

お礼が遅くなりましたが、無事問題解決しました。 たびたびの質問にお答えくださって感謝しております。 ありがとうございましたm(__)m

すると、全ての回答が全文表示されます。
回答No.2

ちょっと考えてみたのですが・・・ フォルダはどのように作られるのでしょうか? もし、プログラムで作るようなら、フォルダを作成したときに、 DBに登録しておいて、DBを検索するというのはどうでしょう? これならNo1内のフォルダが増えてきても余計なフォルダを見なくてもよいし、 条件も~以上、~の間、など簡単に検索できると思いますが・・・ フォルダは違うアプリで作成するようでしたら、別の方法でDBに登録という形になりますが。 まだ、締め切っていなかったので参考までに・・・

snowsaab
質問者

補足

すいません。考えてくださってありがとうございます。 フォルダは既存のものなんですよ。 というよりも、たぶん、他でプログラムより作成していると思うのですが、 また、別のシステムだと思うので・・・。 たぶん、taisuke555さんのおっしゃるとおりDB登録したほうがよいと思うのですが、それも無理のようなので・・・。 いちお、~以上、~以下、~の間の条件のときも、全フォルダを検索するようにしました。 あと、追加質問なんですが、もしおわかりになる範囲で結構ですので、 教えていただけますでしょうか? NO1というフォルダの中にサブフォルダ(この例でいうと『200209201000』など)が存在するかどうか、というのは調べられるのでしょうか?

すると、全ての回答が全文表示されます。
回答No.1

ちょっと難しいですね? 見たところ日付のフォルダっぽいので2003とか出てきそうですね。 test2.text = "20020920"と入力されたとして dr = dir("d:\Test" & "No1" & "\*" ,16) while dr <>"" if ( left(dr,len(text2))>= text2 ) then 'ファイル参照の処理 end if dr = dir() wend のようにNo1フォルダを全部取得して、"20020920"以上か判断するしかないのでは?

snowsaab
質問者

お礼

そうですね・・・。 いちお、そのやり方でやってみます!! ありがとうございましたm(__)m

すると、全ての回答が全文表示されます。

関連するQ&A