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 " 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. |