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