Given a valid path, this code uses Windows API calls to determine the number of bytes in the specified directory, including all subdirectories.
Module
Option Explicit
'API constants
Public Const MAX_PATH = 260
Public Const INVALID_HANDLE_VALUE = -1
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
'API types
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public 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
'API function calls
Public Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32.dll" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As Long) As Long
Private Function APItoString(s As String) As String
Dim x As Integer
x = InStr(s, Chr(0))
If x <> 0 Then
APItoString = Left(s, x - 1)
Else
APItoString = s
End If
End Function
Public Function DirSpace(sPath As String) As Long
Dim f As WIN32_FIND_DATA
Dim hFile As Long
Dim hSize As Long
DirSpace = 0
'Add the slash to the search path
If Right(sPath, 1) <> "\" Then sPath = sPath & "\"
'start a file enum in the specified path
hFile = FindFirstFile(sPath & "*.*", f)
If hFile = INVALID_HANDLE_VALUE Then Exit Function
If (f.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then
'Count file size
DirSpace = DirSpace + f.nFileSizeLow
ElseIf Left(f.cFileName, 1) <> "." Then
'call the DirSpace with subdirectory
DirSpace = DirSpace + DirSpace(sPath & APItoString(f.cFileName))
End If
'Enumerate all the files
Do While FindNextFile(hFile, f)
If (f.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then
'Count file size
DirSpace = DirSpace + f.nFileSizeLow
ElseIf Left(f.cFileName, 1) <> "." Then
'call the DirSpace with subdirectory
DirSpace = DirSpace + DirSpace(sPath & APItoString(f.cFileName))
End If
Loop
'Close the file search
FindClose (hFile)
End Function
Usage
Private Sub Command1_Click()
MsgBox DirSpace("c:\temp") & " bytes in C:\temp"
End Sub