MkTree Function - Make sure that directories exist

Recently, I wrote an application to manage files between directories and needed a function to make sure that the directory structure was the same between the source and destination files. VBA provides a function called MkDir which is used to create a directory, but it requires that the parent directory already exists. Here's a function called MkTree that will walk a path and create all of the directories in the tree for a given file/directory path.

' --------------------------------------------------------------------------
' Function: MkTree
' Purpose : Create directories for a given file name
' Notes   : MkTree "c:\a\b\c\file.txt" would create directories for c:\a\b\c
'           MkTree "c:\a\b\c\" would create c:\a\b\c
'           MkTree "c:\a\b\c" would create c:\a\b
' --------------------------------------------------------------------------
Public Sub MkTree(ByVal strFile As String)
    ' walk the file and make sure the paths exist
    Dim strRoot As String
    Dim strPath As String
    Dim pos As Integer

    ' get the root
    If (InStr(strFile, ":\") = 2) Then
        strRoot = Left(strFile, InStr(strFile, ":\") + 1)
    ElseIf (InStr(strFile, "\\") = 1) Then
        strRoot = Left(strFile, InStr(InStr(strFile, "\\") + 2, strFile, "\"))
    Else
        MsgBox "Invalid Root Directory", vbExclamation
        Exit Sub
    End If

    pos = InStr(Len(strRoot) + 1, strFile, "\")
    While (pos > 0)
        strPath = Left(strFile, pos)

        ' Create the directory
        On Error Resume Next
        MkDir strPath
        Debug.Assert Err = 0 Or Err = 75
        On Error GoTo 0
        pos = InStr(pos + 1, strFile, "\")
    Wend
End Sub

Office Blogs Comments

Comments: (5) Collapse

  • Hi Rob, That looks like a good one for the UA Code Archive if you haven't submitted it already! Please can you give a quick explanation of the Debug.Assert line. Regards, d

  • Any reason why you didn't use SHPathPrepareForWrite() from Shell32.dll?

  • You could also use Shell("mkdir c:\a\b\c\").

  • David, Thanks! Debug.Assert is used to insert a breakpoint based on some condition. In this case, I'm doing error handling inline so this statement is making sure that the error that was received was 0 (no failure), or 75 (path already exists). If a different error was returned the code would break on the Assert line. This is there for debugging and can be removed. Rob

  • Thanks for your comment Extremo. I also used this as an example of parsing for something else I was doing, but that API would work as well. Rob

Comments

Comments: (loading) Collapse