■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#11178-0ファイル検索のロジック混乱中・・・1999-12-08(水) 11:16
     #11182-0RE#11178:ファイル検索のロジックヘルプ侍1999-12-08(水) 11:25
     #11186-0RE#11182:ファイル検索のロジック混乱中・・・1999-12-08(水) 11:44
     #11188-0RE#11186:ファイル検索のロジックU-Root-Y1999-12-08(水) 11:56
     #11191-0RE#11186:ファイル検索のロジックYuO1999-12-08(水) 12:05
     #11192-0RE#11186:ファイル検索のロジックヘルプ侍1999-12-08(水) 12:08
     #11194-0RE#11191:ファイル検索のロジックVIM1999-12-08(水) 12:10
     #11198-0RE#11178:ファイル検索のロジックせつら1999-12-08(水) 12:29
     #11201-0RE#11178:ファイル検索のロジックnaka-kun1999-12-08(水) 12:42
     #11205-0ファイル検索のロジック〜終結?多謝!!感激!!1999-12-08(水) 13:40
#11178-0
ファイル検索のロジック
質問です。

指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。
そこでちょっと問題?が発生してどうすればいいのか分からなくなっちゃいました。
現在の考え方:
DIR関数と、GetAttr関数を使用し、再帰処理でファイルを検索しようと思ったのですが
ヘルプを見てみるとDIR関数が再帰処理に使用できない!!って言うようなことが書いてあって
どうすれば出来るのか分からなくなっちゃいました。

もっといい方法があるとか、情報をお持ちの方ご教授お願いします。

開発環境
Win95C VB5.0 + SP3
#11182-0
RE#11178:ファイル検索のロジック
> 質問です。
> 
> 指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。
> そこでちょっと問題?が発生してどうすればいいのか分からなくなっちゃいました。
> 現在の考え方:
> DIR関数と、GetAttr関数を使用し、再帰処理でファイルを検索しようと思ったのですが
> ヘルプを見てみるとDIR関数が再帰処理に使用できない!!って言うようなことが書いてあって
> どうすれば出来るのか分からなくなっちゃいました。
> 
> もっといい方法があるとか、情報をお持ちの方ご教授お願いします。
> 
> 開発環境
> Win95C VB5.0 + SP3

VBヘルプの「Dir関数」使用例の一番下を参照するべし。
#11186-0
RE#11182:ファイル検索のロジック
ヘルプ侍 さん。早々のレスありがとうございます。

> VBヘルプの「Dir関数」使用例の一番下を参照するべし。
説明不足でした。申し訳ありません。

−−−−<<説明補足>>−−−−

> > 指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。

これは指定されたディレクトリの下位ディレクトリの内容もすべてなのです。
指定したディレクトリがAで、
ディレクトリAの下位にBというディレクトリがあれば、
A+Bのディレクトリの全てのファイルというわけです。
当然、孫や曾孫のディレクトリがあればそれの内容もすべてです。

> VBヘルプの「Dir関数」使用例の一番下を参照するべし。
1番下のヘルプだけでは指定したディレクトリしか検索できないようなので・・・
そこでこの部分を再帰化しようと考えたわけです。

戻ってきた時の為に外部変数で再帰前に使用したパスを保存してみたりしたのですが、
うまくいかなくていろいろ試行錯誤してます。

こんな説明でどうでしょう?
よろしくお願いします。
#11188-0
RE#11186:ファイル検索のロジック
> 戻ってきた時の為に外部変数で再帰前に使用したパスを保存してみたりしたのですが、
> うまくいかなくていろいろ試行錯誤してます。
> 
対象となるフォルダの全部のファイル&フォルダをDirで一気に列挙して一旦配列に格納、
そのあとで、格納した各々のフォルダに対して、再帰処理。

と言うのではどうです。
#11191-0
RE#11186:ファイル検索のロジック
> > > 指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。
> これは指定されたディレクトリの下位ディレクトリの内容もすべてなのです。
> 指定したディレクトリがAで、
> ディレクトリAの下位にBというディレクトリがあれば、
> A+Bのディレクトリの全てのファイルというわけです。
> 当然、孫や曾孫のディレクトリがあればそれの内容もすべてです。
> > VBヘルプの「Dir関数」使用例の一番下を参照するべし。
> 1番下のヘルプだけでは指定したディレクトリしか検索できないようなので・・・
> そこでこの部分を再帰化しようと考えたわけです。

再帰を使わず,DimとReDimで見つかったディレクトリ名を保存していくのはどうですか?
#もの凄く遅くなりそう…

あとは,FindFirstFile〜FindNextFile〜FindClose APIを使うとか。
#これなら再帰でOK
#11192-0
RE#11186:ファイル検索のロジック
> ヘルプ侍 さん。早々のレスありがとうございます。
> 
> > VBヘルプの「Dir関数」使用例の一番下を参照するべし。
> 説明不足でした。申し訳ありません。
> 
> −−−−<<説明補足>>−−−−
> 
> > > 指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。
> 
> これは指定されたディレクトリの下位ディレクトリの内容もすべてなのです。
> 指定したディレクトリがAで、
> ディレクトリAの下位にBというディレクトリがあれば、
> A+Bのディレクトリの全てのファイルというわけです。
> 当然、孫や曾孫のディレクトリがあればそれの内容もすべてです。
> 
> > VBヘルプの「Dir関数」使用例の一番下を参照するべし。
> 1番下のヘルプだけでは指定したディレクトリしか検索できないようなので・・・
> そこでこの部分を再帰化しようと考えたわけです。
> 
> 戻ってきた時の為に外部変数で再帰前に使用したパスを保存してみたりしたのですが、
> うまくいかなくていろいろ試行錯誤してます。
> 
> こんな説明でどうでしょう?
> よろしくお願いします。

Dir関数の再帰呼び出しできない・・・というのは
    
   Dir(Dir(・・・

なんていう使い方ができないと云う意味だと思いますが・・・。
Dir関数を用いた検索関数を再帰呼び出ししてできるはずです。
また、このような関数はみなさん作られるので、どこかにサンプル(もしくはそのものズバリ)があると思います。
#11194-0
RE#11191:ファイル検索のロジック
> > > > 指定されたディレクトリ以下のすべてのファイルを検索するプログラムを作っています。
> あとは,FindFirstFile〜FindNextFile〜FindClose APIを使うとか。

あとは、FileSystemObjectですね。
VB5でも、WSHとかインストールすればOKですから。
#11198-0
RE#11178:ファイル検索のロジック
再帰だ、Dir 関数だ、と判っていらっしゃるなら、Web上で検索すればいくらでもサンプルが出てきそう
ですし、ここでも、私だけでも以前何回かサンプル書いているんですけど、まぁ、確かにログの量は膨大
ですからねぇ。 また書きます。

複数の同名ファイルが存在するので、フォームに ListBox をひとつ貼っておいてください。

Private Sub Command1_Click()
    List1.Clear
    Command1.Enabled = False
    Command1.Caption = "検索中..."
    Call sFileSearch("c:\", "README.TXT")                   '大文字で指定の事
    Command1.Caption = "再検索"
    Command1.Enabled = True
End Sub

Public Sub sFileSearch(cPath As String, cFile As String)
    Dim cw As String
    Dim cwPath As String

    cw = Dir(cPath + "*.*", vbDirectory)                    'ファイル名とパス名

    Do While cw <> ""
        If cw <> "." And cw <> ".." Then
            If (GetAttr(cPath + cw) And vbDirectory) = vbDirectory Then
                cwPath = cw                                 'サブディレクトリが有る場合、
                Call sFileSearch(cPath + cw + "\", cFile)   '再起呼び出し

                cw = Dir(cPath + "*.*", vbDirectory)
                Do While cw <> cwPath                       'Dirは一箇所しか覚えない為、
                    cw = Dir                                '元のパスまで読み飛ばす
                Loop
            Else
                If cFile = UCase(cw) Then                   '大文字で比較
                    List1.AddItem cPath + cw                '結果の表示
                End If
            End If
        End If

        cw = Dir                                            '次のファイル名
    Loop
End Sub
#11201-0
RE#11178:ファイル検索のロジック
はじめまして、naka-kunです。

ご要望にこたえられる方法はいくつかあります。
一番安全でかつ簡単な方法は
FileSystemObjectを使用する方法です。ヘルプで確認してください。
folderオブジェクトのFilesプロパティとsubFoldersプロパティを使えば
フォルダ以下全てのファイルを列挙することが可能です。けっこう、高速に動作します。

また、オフィス(エクセル、ワード、アクセス)などのオブジェクトライブラリを使えるのであれば
FileSearchオブジェクトを使用すると簡単に列挙できます。
ただし、外部ActiveXExeを使用するのでスピードは遅くなります。
まあ、VB5とあるのでこの方法は無理でしょう。

一番危険ですが、恐ろしく高速な方法としては(Windowsのファイル検索とほぼ等速)
APIのFindFirstFile関数による再帰呼び出しです。
かなり高速ですが、APIについて自信がなければやめておいた方がいいと思います。
私は、薦めません。責任持ちません。手助けしません。(笑)

お勧めはFileSystemObjectです。
これは、シェルのネームスペースを使った新しいテクノロジーで
実装されているので時代はやっぱりFileSystemObjectでしょう!?
では、上手く出来ることを祈ります。
#11205-0
ファイル検索のロジック〜終結?
naka-kun 氏
せつら 氏
VIM 氏
ヘルプ侍 氏
YuO 氏
U-Root-Y 氏

皆様ありがとうございました。
まさか、こんなに回答がくるとは思ってもいませんでした。
おかげさまでプログラムも無事できそうです。

これを機に
FileSystemObject
FindFirstFile〜FindNextFile〜FindClose API
というものにもチャレンジしてみようと思います。

APIとかは良く分からないのでまたご迷惑をおかけするかもしれませんが
よろしくお願いします。

感謝!!
このページと関連する記事:
#9376-0EXEのショートカットで2000-04-06(木) 03:51
#11554-0Command関数の使い方教えてください1999-12-13(月) 16:17
#242-0ファイル検索2002-03-01(金) 11:24
#8278-0ドライブ指定からのファイル検索の方法1999-10-27(水) 06:27
#34270-0ファイル検索について・・・教えてください2000-11-28(火) 16:06
#6657-0RE#6656:DLLファイルの認識方法について2000-03-13(月) 21:31
#16888-0File ListBox のリアルタイム表示について2001-07-13(金) 13:23
#10516-0ファイルの検索について1999-11-27(土) 11:47
#27435-0dir関数2002-03-10(日) 14:05
#8547-0ライブラリってなんですか?2000-03-14(火) 20:37
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)