人気ブログランキング | 話題のタグを見る

[VBScript] ワイルドカードを指定したファイル名サーチ

どーもボキです。

ワイルドカードの指定が可能なファイル名サーチ関数「SearchFile」を用意しました。

    FileExists関数(Scripting.FileSystemObjectのメソッド)は、ファイル存在判定が可能となります。
    ただし、ファイル名がわからない・固定できない場合、FileExists関数は適用できません。

    これに対して、CopyFile関数・MoveFile関数ならば、ワイルドカードでのファイル名指定が可能となっています。
    つまり、これらを応用すれば、ワイルドカードを指定したファイル名サーチが可能となります。
    [VBScript] ワイルドカードを指定したファイル名サーチ_a0021757_13330209.png
    ゲッ ワーイエーンダーン このまーちで~♪


SearchFile関数の考え方

  1. 重複しない名前のフォルダを作成する。
  2. 1へ該当ファイル群を移動(MoveFile)する。
  3. 2からファイル名を取得する。
  4. 移動したファイル群を元のフォルダへ戻す(MoveFile)。
  5. 1で作成したフォルダを削除する。


SearchFile関数のソース

    ' 指定したファイル名が存在するか調べる(ワイルドカードOK)
    ' 戻り値:見つかったファイル名(最初に見つかったもの)
    Function SearchFile(DirectoryPath, FileName)
    Dim objFS,f,r,dpth

    r = ""
    On Error Resume Next

    Set objFS = CreateObject("Scripting.FileSystemObject")
    dpth = DirectoryPath & objFS.GetTempName
    objFS.CreateFolder(dpth) ' 重複しないフォルダを作成
    objFS.MoveFile DirectoryPath & FileName, dpth & "\"
    For Each f In objFS.GetFolder(dpth).Files
    r = f.Name
    Exit For
    Next
    objFS.MoveFile dpth & "\" & FileName, DirectoryPath
    objFS.DeleteFolder dpth

    On Error GoTo 0
    SearchFile = r
    End Function


この記事での気付き

    当初、重複しない名前のフォルダには、以下のように時間情報を利用していました。
    d = Now
    dname = Right(Year(d),2) & Right("0" & Month(d),2) & Right("0" & Day(d),2) & "_" & Right("0" & Hour(d),2) & Right("0" & Minute(d),2) & Right("0" & Second(d),2)

    このやり方では、1秒以内に連続してSearchFileを実行すると問題が出ます。ただ、そういった使い方を想定する必要がなかったため、他のやり方を調べることすらしませんでした。

    そんなある日、とある自作アプリが設定ファイルにランダム記名を採用していることに気付き、
    「これはどうやって命名しているのだろう?」
    と調べてみると、Scripting.FileSystemObject のGetTempNameに辿りつけました。

    Windows APIにもPath.GetTempFileName メソッドがあり、他の言語系でもランダム記名を取得するはできそうなことを知りました。

    こうやって、調べていく情報を辿っていくこと、頭の中で多くの情報が構造化され、新しい技術でもスッと理解できていくようになると思います。

    これまでの常識に疑問を持ち、より良い方法がないか考えてみること、より良い方法を見つけたら、今までの方法を変えていくこと。大事な考え方・行動ではないかと思っています。

にほんブログ村 IT技術ブログへ
にほんブログ村
2018/4/15 15:09掲載記事の更新

by yozda | 2020-12-30 10:54 | プログラミング | Comments(0)