Results 1 to 9 of 9

Thread: API Gurus only please!!!

  1. #1

    Thread Starter
    Hyperactive Member CyberSurfer's Avatar
    Join Date
    Aug 2000
    Location
    Old London Town
    Posts
    425
    Part of my app needs to calculate stuff about the Users hard disk(s) which would be done using the GetDiskFreeSpace API. The problem is that this will not work on Drives over 2GB in size, or FAT32 Drives. The recommended Microsoft solution is to use the GetDiskFreeSpaceEx API. My questions are this....


    1) Does the GetDiskFreeSpaceEx API use the same parameters as GetDiskFreeSpace?

    2) Will GetDiskFreeSpaceEx work with FAT16, sub 2GB drives, removing the need to use GetDiskFreeSpace at all?

    3) If not, Microsoft also recommend that you use the GetVersionEx API to determine the users Windows version. How can I distinguish between different versions of Win 95 when using this?

    Thanks in Advance!!

  2. #2
    Guest
    Try the following:
    Code:
    Private Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, lpFreeBytesAvailableToCaller As ULARGE_INTEGER, lpTotalNumberOfBytes As ULARGE_INTEGER, lpTotalNumberOfFreeBytes As ULARGE_INTEGER) As Long
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    
    Private Type ULARGE_INTEGER
      LowPart As Long
      HighPart As Long
    End Type
    
    Dim FreeUser As ULARGE_INTEGER
    Dim Total As ULARGE_INTEGER
    Dim FreeSys As ULARGE_INTEGER
    Dim Temp As Currency
    Dim fTemp As Currency
    
    Private Sub Command1_Click()
        'Get DiskSpace
        GetDiskFreeSpaceEx "C:\", FreeUser, Total, FreeSys
        CopyMemory Temp, Total, 8
        CopyMemory fTemp, FreeUser, 8
        Print "Total Space: " & (CCur(Temp) * 10000) / 1000000000 & " GB"
        Print "Free Space: " & (CCur(fTemp) * 10000) / 1000000000 & " GB"
    End Sub

  3. #3

    Thread Starter
    Hyperactive Member CyberSurfer's Avatar
    Join Date
    Aug 2000
    Location
    Old London Town
    Posts
    425

    Megatron

    Thanks Megatron.

    This is the code I have so far.


    Code:
    Option Explicit
    
    Public Type DRIVE_INFO
      DrvSectors              As Long
      DrvBytesPerSector       As Long
      DrvFreeClusters         As Long
      DrvTotalClusters        As Long
      DrvSpaceFree            As Long
      DrvSpaceUsed            As Long
      DrvSpaceTotal           As Long
    End Type
            
    Public Declare Function GetDiskFreeSpace _
         Lib "kernel32" Alias "GetDiskFreeSpaceA" _
        (ByVal lpRootPathName As String, _
         lpSectorsPerCluster As Long, _
         lpBytesPerSector As Long, _
         lpNumberOfFreeClusters As Long, _
         lpTotalNumberOfClusters As Long) As Long
    
    Public Declare Function GetLogicalDriveStrings _
         Lib "kernel32" Alias "GetLogicalDriveStringsA" _
        (ByVal nBufferLength As Long, _
         ByVal lpBuffer As String) As Long
    
       
    FORM CODE
      
    Option Explicit
    
    Private Sub Form_Load()
    
       Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
       LoadAvailableDrives Combo1
       Combo1.ListIndex = 1
      
    End Sub
    
    
    Private Sub cmdEnd_Click()
       
       Unload Me
       
    End Sub
    
    
    Private Sub cmdVolumeInfo_Click()
    
      'Calls other functions to provide the info.
      'Data is stored in my own user-defined type.  
       Dim RDI As DRIVE_INFO
       Dim r As Long
       Dim RootPathName As String
    
      'get the drive to find   
       RootPathName = Combo1.List(Combo1.ListIndex)
    
      'get the drive's disk parameters   
       Call rgbGetDiskFreeSpaceRDI(RootPathName, RDI)
    
      'show the results  
       Cls
       Print
       Print "  Drive Statistics for  ", ":  "; UCase$(RootPathName$)
       Print
       Print "  No of Sectors", ":  "; RDI.DrvSectors
       Print "  Bytes per sector", ":  "; RDI.DrvBytesPerSector
       Print "  Clusters Free", ":  "; RDI.DrvFreeClusters
       Print "  Total Clusters", ":  "; RDI.DrvTotalClusters
       Print "  Drive Space Used", ":  "; Format$(RDI.DrvSpaceUsed, "###,###,###,##0") & " bytes"
       Print "  Drive Space Free", ":  "; Format$(RDI.DrvSpaceFree, "###,###,###,##0") & " bytes"
       Print "  Total Drive Size", ":  "; Format$(RDI.DrvSpaceTotal, "###,###,###,##0") & " bytes"
    
    End Sub
    
    
    Private Sub LoadAvailableDrives(cmbo As ComboBox)
    
      Dim lpBuffer As String
    
     'get list of available drives
      lpBuffer = GetDriveString()
    
     'Separate the drive strings
     'and add to the combo. StripNulls
     'will continually shorten the
     'string. Loop until a single
     'remaining terminating null is
     'encountered.
      Do Until lpBuffer = Chr(0)
      
       'strip off one drive item
       'and add to the combo
        cmbo.AddItem StripNulls(lpBuffer)
        
      Loop
      
    End Sub
    
    
    Private Function GetDriveString() As String
    
      'returns string of available
      'drives each separated by a null
       Dim sBuffer As String
       
      'possible 26 drives, three characters each
       sBuffer = Space$(26 * 3)
      
      If GetLogicalDriveStrings(Len(sBuffer), sBuffer) Then
    
         'do not trim off trailing null!
          GetDriveString = Trim$(sBuffer)
          
       End If
    
    End Function
    
    
    Private Function StripNulls(startstr As String) As String
    
     'Take a string separated by chr$(0)
     'and split off 1 item, shortening the
     'string so next item is ready for removal.
      Dim pos As Long
    
      pos = InStr(startstr$, Chr$(0))
      
      If pos Then
          
          StripNulls = Mid$(startstr, 1, pos - 1)
          startstr = Mid$(startstr, pos + 1, Len(startstr))
          Exit Function
        
      End If
    
    End Function
    
    
    Private Function rgbGetDiskFreeSpaceRDI(RootPathName, _
                                            RDI As DRIVE_INFO) As Long
    
      'returns data about the selected drive.
      'Passed is the RootPathName; the other
      'variables are filled in here. 
       Dim r As Long
      
       r = GetDiskFreeSpace(RootPathName, RDI.DrvSectors, _
                            RDI.DrvBytesPerSector, _
                            RDI.DrvFreeClusters, _
                            RDI.DrvTotalClusters)
       
       RDI.DrvSpaceTotal = (RDI.DrvSectors * RDI.DrvBytesPerSector * RDI.DrvTotalClusters)
       RDI.DrvSpaceFree = (RDI.DrvSectors * RDI.DrvBytesPerSector * RDI.DrvFreeClusters)
       RDI.DrvSpaceUsed = RDI.DrvSpaceTotal - RDI.DrvSpaceFree
      
       rgbGetDiskFreeSpaceRDI = r
    
    End Function
    I did not write this, which is why I am not sure. Will this work if I change GetDiskFreeSpace to GetDiskFreeSpaceEx??

    THX


  4. #4

    Thread Starter
    Hyperactive Member CyberSurfer's Avatar
    Join Date
    Aug 2000
    Location
    Old London Town
    Posts
    425
    NE Body?

  5. #5
    Addicted Member
    Join Date
    May 2000
    Location
    Grand Rapids, MI
    Posts
    231
    I dont have the answer, but just wanted to say, you wouldnt
    get too far if you say you ONLY want Guru's to help,
    considering there may be an intermediate people who knows
    this particular API command very well. I used it alot, but
    since I'm not a Guru I guess I better not answer.

    [edited to make it fit the screen]
    -Karl Blessing aka kb244{fastHACK}
    [email protected]

  6. #6
    Fanatic Member
    Join Date
    Feb 2000
    Location
    The Netherlands
    Posts
    715
    Look at www.vbapi.com

  7. #7

    Thread Starter
    Hyperactive Member CyberSurfer's Avatar
    Join Date
    Aug 2000
    Location
    Old London Town
    Posts
    425
    Sorry kb244!

    I should probably have put Guru Question. Its just that questions with the word Guru in the subject tend to get lots of views. No offence meant. Any help welcome!

    Thanks oetje, will do.

  8. #8
    Guest
    The example I provided demonstrates the use of GetFreeDiskSpaceEx.

  9. #9

    Thread Starter
    Hyperactive Member CyberSurfer's Avatar
    Join Date
    Aug 2000
    Location
    Old London Town
    Posts
    425
    Thanks very much Megatron.

    I was wondering whether GetDiskSpaceEx did all that free cluster stuff, but upon looking it up on VBAPI (thanks oetje) I discovered that it didn't. I wasn't dismissing your example or anything.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width