webkiwi1
asked on
Problems calculating total directory size inclusive of files and sub directories
I am using the following function to calculate TOTAL directory size, inclusive of sub directories and files.
I works for all of the files within the main directory, but then resets when it goes to the first sub directory.
Can anyone see where it is going wrong and how it can be fixed.
Thanks,
Michael
Function GetFolderSize(ByVal DirPath As String, Optional ByVal IncludeSubFolders As Boolean = True) As Long
Dim lngDirSize As Long
Dim objFileInfo As FileInfo
Dim objDir As DirectoryInfo = New DirectoryInfo(DirPath)
Dim objSubFolder As DirectoryInfo
Try
'add length of each file
For Each objFileInfo In objDir.GetFiles()
lngDirSize += objFileInfo.Length
Next
'call recursively to get sub folders
'if you don't want this set optional
'parameter to false
If IncludeSubFolders = True Then
For Each objSubFolder In objDir.GetDirectories()
lngDirSize += GetFolderSize(objSubFolder .FullName)
Next
End If
Catch Ex As Exception
End Try
If lngDirSize > 0 Then
Return BytesToMegabytes(lngDirSiz e)
Else
Throw New Exception("Invalid or unreadable directory")
Exit Function
End If
End Function
Private Function BytesToMegabytes(ByVal Bytes As Long) _
As Long
Dim dblAns As Double
dblAns = (Bytes / 1024) / 1024
BytesToMegabytes = Format(dblAns, "###,###,##0.00")
End Function
It is being called with:
TotalData = GetFolderSize("c:\temp\", True)
I works for all of the files within the main directory, but then resets when it goes to the first sub directory.
Can anyone see where it is going wrong and how it can be fixed.
Thanks,
Michael
Function GetFolderSize(ByVal DirPath As String, Optional ByVal IncludeSubFolders As Boolean = True) As Long
Dim lngDirSize As Long
Dim objFileInfo As FileInfo
Dim objDir As DirectoryInfo = New DirectoryInfo(DirPath)
Dim objSubFolder As DirectoryInfo
Try
'add length of each file
For Each objFileInfo In objDir.GetFiles()
lngDirSize += objFileInfo.Length
Next
'call recursively to get sub folders
'if you don't want this set optional
'parameter to false
If IncludeSubFolders = True Then
For Each objSubFolder In objDir.GetDirectories()
lngDirSize += GetFolderSize(objSubFolder
Next
End If
Catch Ex As Exception
End Try
If lngDirSize > 0 Then
Return BytesToMegabytes(lngDirSiz
Else
Throw New Exception("Invalid or unreadable directory")
Exit Function
End If
End Function
Private Function BytesToMegabytes(ByVal Bytes As Long) _
As Long
Dim dblAns As Double
dblAns = (Bytes / 1024) / 1024
BytesToMegabytes = Format(dblAns, "###,###,##0.00")
End Function
It is being called with:
TotalData = GetFolderSize("c:\temp\", True)
This value of Dim lngDirSize As Long is getting rest to 0 each time the function GetFolderSize is called. Pass in the value of lngDirSize to the function and the first time you call it pass in 0.
ASKER
I understand what you are saying, how would I pass in the value?
Would the call to BytesToMegaBytes towards the bottom of your function affect things too if you're calling it recursively and adding the results together? You're essentially working with two different scales, if this is right call this on the overal result of GetFolderSize
ASKER
Another good point Babycorn-Starfish (?!?!?!)
Perhaps I should move the call to MytesToMegaBytes from the GetFolderSize function to the page load sub.
Perhaps I should move the call to MytesToMegaBytes from the GetFolderSize function to the page load sub.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
comment or uncomment the Format bit depending on what you need. You may want to round it up or down depending on how accurate you need it too
Sorry, left my file path in there !
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Change my file path in my last post
Hi webkiwi1;
As I stated in my post above you want to convert the bytes to megabytes at the very end and not after each directory is completed being tallied up. Also the exception you are throwing is not really true, "Invalid or unreadable directory", because directory info only returns valid names. Also a directory may have no files in it and will have zero bytes returned which does not make it a invalid directory.
If lngDirSize > 0 Then
Return BytesToMegabytes(lngDirSiz e)
Else
Throw New Exception("Invalid or unreadable directory")
Exit Function
End If
Fernando
As I stated in my post above you want to convert the bytes to megabytes at the very end and not after each directory is completed being tallied up. Also the exception you are throwing is not really true, "Invalid or unreadable directory", because directory info only returns valid names. Also a directory may have no files in it and will have zero bytes returned which does not make it a invalid directory.
If lngDirSize > 0 Then
Return BytesToMegabytes(lngDirSiz
Else
Throw New Exception("Invalid or unreadable directory")
Exit Function
End If
Fernando
ASKER
Got both to work. For some reason the calculated value using Fernado's was off somewhere, but function still worked. Thanks guys for the fast and accurate responses.