ファイル名をチェックする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しておしまい。
使ってみる
禁則文字がないので、False
が返った。
禁則文字「\
」があるので、True
が返った。
禁則文字「/
」があるので、True
が返った。
禁則文字「*
」があるので、True
が返った。
以下略。
おわりに
こういうちょっとしたものをため込んでおくと便利。ただし、数が多くなってくると、モジュールを分けて気の利いた名前を付けて整理するとかしておかないと、せっかく作った便利メソッドが埋もれてしまう。
追記
thom (id:t-hom)さんからコメントをいただき、上掲リスト1の(3)のところでSplit
関数を用いることにした。
各要素を半角スペースで区切り、Split
関数の第2引数を省略すると、第2引数に半角スペースを指定したのと同じになるらしい。
たしかに、いちいち一つづつ「"
」で括ってArray
関数を使うよりかなり楽だ。
ついでに、For
ループ用のカウンタもLbound
とUbound
で指定するようにした。
まあ、禁則文字が増減することはあまりないだろうし、マジックナンバーといえど、このプロシージャ内で完結しているので、無問題とは思いますが……。
リスト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