ファイル名をチェックするFunction

不正なファイル名を検出するFunction

作ってみた。

コード

コードは次の通り。

リスト1 標準モジュール
Public Function hasProhibitedCharacter( _
                  ByVal fileName As String) As Boolean    '……(1)'
  hasProhibitedCharacter = True    '……(2)'
  Dim ar As Variant
  ar = Array("\", "/", ":", "*", "?", "<", ">", "|")    '……(3)'"
  Dim i As Long
  For i = 0 To 7    '……(4)'
    If InStr(fileName, ar(i)) > 0 Then Exit Function
  Next
  hasProhibitedCharacter = False    '……(5)'
End Function

(1)の

Public Function hasProhibitedCharacter(ByVal fileName As String) As Boolean

は引数と返り値の設定。ファイル名を表す文字列を受け取って、結果をBooleanで返す。

(2)の

hasProhibitedCharacter = True

でひとまず返り値をTrueにしておく。

こうしておくと、不正な文字を検出した瞬間にExit Functionするだけで済む。

(3)の

ar = Array("\", "/", ":", "*", "?", "<", ">", "|")

で、禁則文字を配列化。

あとは、(4)からの3行

For i = 0 To 7
  If InStr(fileName, ar(i)) > 0 Then Exit Function
Next

で、引数fileName内に禁則文字があったら、その時点でExitするようにしている。

これで、禁則文字が1つでもあったらTrueが返ることになる。

(4)のForループを無傷で通り抜けると、そこには(5)の

hasProhibitedCharacter = False

が待っている。ここまで来たということは、禁則文字がファイル名に使われていなかったということなので、Falseをreturnしておしまい。

使ってみる

f:id:akashi_keirin:20180901162744j:plain

禁則文字がないので、Falseが返った。

f:id:akashi_keirin:20180901162750j:plain

禁則文字「\」があるので、Trueが返った。

f:id:akashi_keirin:20180901162804j:plain

禁則文字「/」があるので、Trueが返った。

f:id:akashi_keirin:20180901162813j:plain

禁則文字「*」があるので、Trueが返った。

以下略。

おわりに

こういうちょっとしたものをため込んでおくと便利。ただし、数が多くなってくると、モジュールを分けて気の利いた名前を付けて整理するとかしておかないと、せっかく作った便利メソッドが埋もれてしまう。

追記

thom (id:t-hom)さんからコメントをいただき、上掲リスト1の(3)のところでSplit関数を用いることにした。

各要素を半角スペースで区切り、Split関数の第2引数を省略すると、第2引数に半角スペースを指定したのと同じになるらしい。

たしかに、いちいち一つづつ「"」で括ってArray関数を使うよりかなり楽だ。

ついでに、Forループ用のカウンタもLboundUboundで指定するようにした。

まあ、禁則文字が増減することはあまりないだろうし、マジックナンバーといえど、このプロシージャ内で完結しているので、無問題とは思いますが……。

スト2 標準モジュール
Public Function hasProhibitedCharacter(ByVal fileName As String) As Boolean
  hasProhibitedCharacter = True
  Dim ar As Variant
  ar = Split("\ / : * ? < > |")
  Dim i As Long
  For i = LBound(ar) To UBound(ar)
    If InStr(fileName, ar(i)) > 0 Then Exit Function
  Next
  hasProhibitedCharacter = False
End Function