● ディレクトリを作成する ●

VBではディレクトリを作成する関数に mkdir というのが用意されているが、これがまた微妙。まあ

    Call MkDir("C:\\Test")

とすればディレクトリを作成してくれるのだが、既に C:\Test ディレクトリが存在する場合に上記を実行すると、

「パス名が無効です。」というエラー番号75のエラーを返してくる。ディレクトリが存在しているのだったら、その旨を示すエラーを返してくれば良いのに、中途半端なエラーを返してくるわけである。無理矢理関数化するのであれば、

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:ディレクトリを作成する
' 引  数:(i)DirName … ディレクトリ名
' 戻り値:なし
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Private Sub CreateDir(ByVal DirName As String)
    On Error GoTo ErrHandler

    Call MkDir(DirName)

Normal_exit:
    Exit Sub

'この辺のエラー処理は御自由に
ErrHandler:
    Select Case Err.Number
        Case 75
            '何もしない
        Case Else
            Call Err.Raise(Err.Number)
    End Select
End Sub

とすれば一応はできる。

でもまあ、こんなことするのであればAPIを使っちゃうという手もある。この辺は個人の好みだね。

Private Type SECURITY_ATTRIBUTES
      nLength As Long              '構造体のサイズ
      lpSecurityDescriptor As Long 'セキュリティディスクリプタ
      bInheritHandle As Long       '1の時、属性を継承する
End Type

Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:ディレクトリを作成する
' 引  数:(i) DirName … ディレクトリ名
' 戻り値:ディレクトリを作成された場合は1、それ以外は0
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Private Function CreateDir(ByVal DirName As String) As Long

    Dim udtSA As SECURITY_ATTRIBUTES

    udtSA.nLength = Len(udtSA)
    CreateDir = CreateDirectory(DirName, udtSA)

End Function

Windows XP(SP2) または Windows 2003 Server 以降であれば、SHCreateDirectory を使用することも可能。

戻る