SpaceDisk (4)




Option Explicit
Declare Function GetLogicalDriveStrings Lib "kernel32" _
Alias "GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
Declare Function GetDiskFreeSpaceEx Lib "kernel32" _
Alias "GetDiskFreeSpaceExA" _
(ByVal lpRootPathName As String, _
lpFreeBytesAvailableToCaller As Currency, _
lpTotalNumberOfBytes As Currency, _
lpTotalNumberOfFreeBytes As Currency) As Long
Option Explicit
Private Sub cmdEnd_Click()
Unload Me
End Sub

Private Sub cmdFat32VolumeInfo_Click()
Dim r As Long
Dim BytesFreeToCalller As Currency
Dim TotalBytes As Currency
Dim TotalFreeBytes As Currency
Dim TotalBytesUsed As Currency

Dim RootPathName As String

'the drive to find

RootPathName = Combo1.List(Combo1.ListIndex)

'get the drive's disk parameters

r = GetDiskFreeSpaceEx(RootPathName, BytesFreeToCalller, TotalBytes, TotalFreeBytes)

'show the results, multiplying the returned

'value by 10000 to adjust for the 4 decimal

'places that the currency data type returns.

Cls
Print
Print " Total Number Of Bytes:", _
Format$(TotalBytes * 10000, "###,###,###,##0") & " bytes"
Print " Total Free Bytes:", _
Format$(TotalFreeBytes * 10000, "###,###,###,##0") & " bytes"

Print " Free Bytes Available:", _
Format$(BytesFreeToCalller * 10000, "###,###,###,##0") & " bytes"

Print " Total Space Used :", _
Format$((TotalBytes - TotalFreeBytes) * 10000, "###,###,###,##0") & " bytes"
End Sub

Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
LoadAvailableDrives Combo1
Combo1.ListIndex = 1

End Sub

Private Function rgbGetLogicalDriveStrings() As String
'returns a single string of available drive

'letters, each separated by a chr$(0) null


Dim r As Long
Dim sBuffer As String

sBuffer = Space$(64)

r& = GetLogicalDriveStrings(Len(sBuffer), sBuffer)

sBuffer = Trim$(sBuffer)
rgbGetLogicalDriveStrings = sBuffer
End Function

Private Sub LoadAvailableDrives(cmbo As ComboBox)
Dim r As Long
Dim DriveSize As Long
Dim lpBuffer As String
Dim currDrive As String
'get the list of all available drives

lpBuffer = rgbGetLogicalDriveStrings()
'Separate the drive strings and add them

'to the combobox.

Do Until lpBuffer = Chr(0)

'strip off one drive item from the lpBuffer

currDrive = StripNulls(lpBuffer)

'add the drive to the combo list

cmbo.AddItem currDrive

Loop

End Sub

Private Function StripNulls(startStrg As String) As String
'Take a string separated by a space, and split off 1 item, and

'shorten the string so that the next item is ready for removal.

Dim c As Integer
Dim item As String

c = 1

Do
If Mid(startStrg, c, 1) = Chr(0) Then

item = Mid(startStrg, 1, c - 1)
startStrg = Mid(startStrg, c + 1, Len(startStrg))
StripNulls = item
Exit Function

End If
c = c + 1
Loop
End Function

The routine presented here will return the correct free and
used disk sizes on volumes over 2 gigabytes as supported by
the FAT32 partitions implemented in Windows95 OEM S.Pack 2,
aka OSR2. OSR2 was initially provided only to OEMs who provide
the Windows95 platform pre-installed on manufactured machines,
and may not be generally available as a release version to the
public. Nonetheless, application developers need to account
for those users running OSR2, where the drive space methods
using GetDiskFreeSpace will return incorrect values.
The GetFreeSpaceEx API utilized here correctly returns the
file sizes on drioves or volumes over 2 gigabytes,
the previous GetFreeDiskSpace limit.










( spacedisk4.html )- by Paolo Puglisi - Modifica del 17/12/2023