● ディレクトリの存在判定を行う ●

VB5.0ってディレクトリの存在をチェックしてくれる関数ってあったっけ? と敢えてとぼけてみる。VB6.0では FileSystemObject というのを使えばできるようだが詳細は不明。一応「VB6.0は興味ないもんね〜」という立場だし、そもそもVB6.0自体を持っていないので FileSystemObject の検証なんて出来ません。なおエクセルで出来ますよ〜、というツッコミは大いに無効である。

さて再度質問。VB5.0ってディレクトリ存在チェック関数あったっけ?Dir$ という便利関数があるが、これはファイルの存在チェックしか行ってくれない(と再度、敢えてとぼけておく)。であるならば、例によって自作しちゃえば良いのではないかと。

簡単な機能の割にはコーディング量は無駄に多いよ。

Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type

Private Const MAX_PATH = 260

Private Type WIN32_FIND_DATA
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        nFileSizeHigh As Long
        nFileSizeLow As Long
        dwReserved0 As Long
        dwReserved1 As Long
        cFileName As String * MAX_PATH
        cAlternate As String * 14
End Type

Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_COMPRESSED = &H800
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_ATTRIBUTE_READONLY = &H1
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long

Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Private Const INVALID_HANDLE_VALUE = -1

'-----------------------------------------------------------------------
' 関数名 : IsExistDir
' 機能   : ディレクトリが存在するか調べる
' 引数   : (in) DirName … ディレクトリ名
' 返り値 : True :ディレクトリは存在する  False:存在しない
'-----------------------------------------------------------------------
Public Function IsExistDir(ByVal DirName As String) As Boolean

      Dim udtW32FD As WIN32_FIND_DATA
      Dim hDir As Long  'ディレクトリのハンドル

      'ディレクトリの検索ハンドルを取得する
      hDir = FindFirstFile(DirName, udtW32FD)
      If hDir <> INVALID_HANDLE_VALUE Then
          'IsExistDir = ((udtW32FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) _
          '               = FILE_ATTRIBUTE_DIRECTORY)
          '↑丁寧に書くなら、簡潔に書くなら↓
          IsExistDir = (udtW32FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)
      End If

      Call FindClose(hDir)

End Function

ファイルとディレクトリの存在チェックを兼ねるなら hDir が INVALID_HANDLE_VALUE かどうかを見ればよい。ここではディレクトリ存在チェックを行っているため、WIN32_FIND_DATA 構造体の dwFileAttributes メンバを見て、ディレクトリ判定を行っている。

じゃ最後なので書いておくか。空しい話題をよくここまで引っ張った。結論としては VB のディレクトリ判定方法は2つ方法がある、

(1) IsDir = (Dir$(ディレクトリパス, vbDirectory) <> "")
(2) IsDir = (GetAttr(ディレクトリパス) And vbDirectory)

で可能。(1)はファイル名が渡された場合も True が返るので、(2)を使っておけば間違いない。てか、(2)は上で挙げたロジックと同じであろうと思われる。わざわざAPI関数を使う必要はありませんですな。はい。


戻る