Number of Bytes in a Directory
Posted: 2019-10-01
By: AndreaTincani
Viewed: 177
Filed Under:
VB6 Custom Functions, VB6 Windows API, VB6 Files and I/O, VB6 Code Cache
No attachments for this post
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
Special Instructions
This code originally appeared on AndreaVB.com, and has been republished here with the permission of Andrea Tincani.
Comments on this post
No comments have been added for this post.
You must be logged in to make a comment.