Search Tools Links Login

Number of Bytes in a Directory


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

About this post

Posted: 2019-10-01
By: AndreaTincani
Viewed: 216 times

Categories

Visual Basic 6

Attachments

No attachments for this post

Special Instructions

This code originally appeared on AndreaVB.com, and has been republished here with the permission of Andrea Tincani.


Loading Comments ...

Comments

No comments have been added for this post.

You must be logged in to make a comment.