FC2ブログ

スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

フォルダを辿り、ファイルを探す? 


フォルダを辿りながら、ある指定した文字列に一致したフォルダを求めたい・・・
これ、FileSystemObject を使った方法でやってみました。

関数 fncDirSearch を作っておいて、再帰的に呼び出すことでフォルダの・・・ またフォルダ・・・
また、見つかったフォルダのパスを格納しておく先に Dictionary を使ってみる。

以下を標準モジュールに記述し、test1() を実行するとソコソコに・・・
Dim dic As Object

Private Sub fncDirSearch(ByVal iNst As Long, sDir As String, sChar As String)
  Static oFSO As Object
  Dim v As Variant

  If (iNst = 0) Then Exit Sub
  iNst = iNst - 1
  If (oFSO Is Nothing) Then
    Set oFSO = CreateObject("Scripting.FileSystemObject")
  End If

  For Each v In oFSO.GetFolder(sDir).SubFolders
    If (v.Name Like "*" & sChar & "*") Then
      dic(dic.Count) = v.Path
    End If
    If (iNst <> 0) Then Call fncDirSearch(iNst, v.Path, sChar)
  Next
End Sub

Sub test1()
  Dim v As Variant

  Set dic = CreateObject("Scripting.Dictionary")
  Call fncDirSearch(1, "E:\tmp2", "a")

  If (dic.Count > 0) Then
    For Each v In dic.Items
      Debug.Print v
    Next
  End If
  Set dic = Nothing
End Sub

fncDirSearch では、
どの位のフォルダの階層で調べればいいの・・・ iNst:1段なら 1 (あるだけ全部なら -1 以下)
どのパスにあるフォルダを対象にしたらいいの・・・ sDir
どの文字列を探すの・・・ sChar

上記では
  Call fncDirSearch(1, "E:\tmp2", "a")
で呼び出しているので、
・"E:\tmp2" フォルダから、
・1段分("E:\tmp2" にあるフォルダだけ)
・"a" が含まれるフォルダがあったら
で検索します。

    If (v.Name Like "*" & sChar & "*") Then
      dic(dic.Count) = v.Path
    End If
で、そのフォルダ名に sChar の内容があったら Dictionary に登録していきます。
今回の Dictionary の使い方では、あったものをドンドン追加したいので、キーは重複しない物・・・
単に考えれば、dic.Count は、異なるキーを登録すれば増加していくので、重複しない様に・・・
この方法で登録したものは、dic.Items で得ると・・・ 登録した順に配列として得る事が出来ます。

自分でやろうとしたら、配列を用意しておいて・・・
事前に決まった配列数の変数を作っておいて、登録したら配列添え字のカウンタを更新・・・
もしくは、登録するたびに配列の大きさを増加させながら・・・・
とかありますが、遅くなるかもしれないけど・・・
 ・・・ Dictionary を使っておけば、自分でやらない分・・・ 楽は楽・・・

v.Name とすると、そのフォルダ名だけが参照できるし・・・
v.Path とすると、そのフォルダの絶対パスがわかるし・・・

上記では、新しく求まったフォルダ名に対して Like 判別してますが、
パスに文字列が含まれる・・・・ なら、v.Path を Like 対象にすれば良いですね・・・
 
じゃぁ・・・、求まったフォルダを開く(エクスプローラ)で表示するには・・・
私は、API を使っちゃいます。

Shell 起動だと、対象のアプリケーションのパスを指定しないと・・・とか
Hyperlink で起動すると Web 用のツールバーが表示される・・・ とか
この辺は、過去記事「ハイパーリンクって、、、セキュリティは」あたりを見て頂ければと

という事で、標準モジュールに以下を記述しておきます。
Declare Function apiShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
  , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Const SW_SHOWNORMAL = 1   ' 正常

Public Sub appShellExecute(sPath As String)
  Call apiShellExecute(0, "OPEN", sPath, "", "", SW_SHOWNORMAL)
End Sub

で、呼び出す時は、
Sub test1()
  Dim v As Variant

  Set dic = CreateObject("Scripting.Dictionary")
  Call fncDirSearch(1, "E:\tmp2", "a")

  If (dic.Count > 0) Then
    For Each v In dic.Items
      Call appShellExecute(CStr(v))
    Next
  End If
  Set dic = Nothing
End Sub
の様に・・・

これを使って起動表示されるのは、引数 sPath に指定した拡張子によって異なります。
今回は、フォルダのパスを指定したので、エクスプローラが起動されると思います。

例えば、
sPath が "http://kikutips.blog13.fc2.com/blog-entry-93.html" であれば
・普通使うブラウザが IE なら IE が起動され・・・
sPath が "E:\tmp\aaa.xls" であれば
・Excel が起動され・・・
sPath が "E:\tmp\bbb.jpg" であれば
・フォトギャラリー が起動され・・・ また、ペイントであったり

※ 起動されるのは、そのパソコンの環境で設定されている拡張子解釈に左右されます。


じゃぁ・・・ じゃぁでもないですが・・・
ファイルを探してみますか・・・・
条件としては同じように、こういう文字列が含まれるファイル名を・・・ フォルダ何段まで・・・

Dim dic As Object

Private Sub fncFileSearch(ByVal iNst As Long, sDir As String, sChar As String)
  Static oFSO As Object
  Dim v As Variant

  If (iNst = 0) Then Exit Sub
  iNst = iNst - 1
  If (oFSO Is Nothing) Then
    Set oFSO = CreateObject("Scripting.FileSystemObject")
  End If

  For Each v In oFSO.GetFolder(sDir).Files
    If (v.Name Like "*" & sChar & "*") Then
      dic(dic.Count) = v.Path
    End If
  Next

  If (iNst <> 0) Then
    For Each v In oFSO.GetFolder(sDir).SubFolders
      Call fncFileSearch(iNst, v.Path, sChar)
    Next
  End If
End Sub

Sub test2()
  Dim v As Variant

  Set dic = CreateObject("Scripting.Dictionary")
  Call fncFileSearch(1, "E:\tmp2", "1.txt")

  If (dic.Count > 0) Then
    For Each v In dic.Items
      Debug.Print v ' ★★
    Next
  End If
  Set dic = Nothing
End Sub

そんなに記述は変わりませんね・・・

★★部分で、何をさせたい・・・・ その記述に変更すれば良いですね・・・
 後は、エラー処理を組み込めば・・・ 使えそう・・・ かな

※※ dic(dic.Count) = v.Path っていう使い方はいろいろと便利かも??


今回、サンプルファイルはありません
関連記事

2013/09/20

Category: 辿る

TB: --  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。