Code archives/Miscellaneous/Win32 DriveInfo GetHardDrives() GetCdDrives() GetNetworkDrives() GetRemoveableDrives() GetRamDrives()

This code has been declared by its author to be Public Domain code.

Download source code

Win32 DriveInfo GetHardDrives() GetCdDrives() GetNetworkDrives() GetRemoveableDrives() GetRamDrives() by skn32007
EXAMPLE
Local drives:TList
Local drive:tdriveinfo

Print "[hard drives]"
drives = GetHardDrives()
For drive = EachIn drives
	Print "  ("+drive.label+") :: "+drive.availablestring()+" / "+drive.capacitystring()+ " ("+drive.percentused()+"% used)"
Next

Print "[network drives]"
drives = GetNetworkDrives()
For drive = EachIn drives
	Print "  ("+drive.label+") :: "+drive.availablestring()+" / "+drive.capacitystring()+ " ("+drive.percentused()+"% used)"
Next

Print "[cd drives]"
drives = GetCdDrives()
For drive = EachIn drives
	Print "  ("+drive.label+") :: "+drive.availablestring()+" / "+drive.capacitystring()+ " ("+drive.percentused()+"% used)"
Next
Strict

'Import brl.standardio
Import brl.linkedlist

Const DRIVE_UNKNOWN:Int = 0     'The drive Type cannot be determined.
Const DRIVE_NO_ROOT_DIR:Int = 1 'The root path is invalid; For example, there is no volume is mounted at the path.
Const DRIVE_REMOVABLE:Int = 2   'The drive has removable media; For example, a floppy drive, thumb drive, Or flash card reader.
Const DRIVE_FIXED:Int = 3       'The drive has fixed media; For example, a hard drive Or flash drive.
Const DRIVE_REMOTE:Int = 4      'The drive is a remote (network) drive.
Const DRIVE_CDROM:Int = 5       'The drive is a CD-ROM drive.
Const DRIVE_RAMDISK:Int = 6     'The drive is a RAM disk.

Extern "win32"
	Function _GetDiskFreeSpaceEx(lpdirectoryname:Byte Ptr,lpfreebytesavailable:Byte Ptr,lptotalnumberofbytes:Byte Ptr,lptotalnumberoffreebytes:Byte Ptr) = "GetDiskFreeSpaceExA@16"
	Function _GetLogicalDriveStrings(nbufferlength:Int,lpbuffer:Byte Ptr) = "GetLogicalDriveStringsA@8"
	Function _GetDriveType(lprootpathname:Byte Ptr) = "GetDriveTypeA@4"
End Extern

Type tdriveinfo
	Const buffersize:Int = 256
	
	Global buffer:Byte[tdriveinfo.buffersize]
	
	Field drivetype:Int
	Field availablebytes:Long
	Field totalbytes:Long
	Field freebytes:Long
	Field label:String
	
	Function _setcstring:Byte Ptr(nstring:String)
		Local temp_i:Int
		'write string
		For temp_i = 0 Until nstring.length
			tdriveinfo.buffer[temp_i] = nstring[temp_i]
		Next
		'write null
		tdriveinfo.buffer[nstring.length] = 0
		
		Return tdriveinfo.buffer
	End Function
	
	Function _getfromstring:String()
		Local temp_i:Int
		Local temp_string:String
		For temp_i = 0 Until tdriveinfo.buffersize
			If temp_i = tdriveinfo.buffersize-1 Or tdriveinfo.buffer[temp_i] = 0
			Else
				temp_string = temp_string + Chr(tdriveinfo.buffer[temp_i])
			End If
		Next
		Return temp_string
	End Function
	
	Function _bytestospacestring:String(nspace:Long)
		If nspace < 1024 '1 k
			Return tdriveinfo._trimfloat(nspace)+" b"
		ElseIf nspace < 1048576 '1 meg
			Return tdriveinfo._trimfloat(nspace / 1024.0)+" k"
		ElseIf nspace < 1073741824 '1 gig
			Return tdriveinfo._trimfloat(nspace / 1048576.0)+" meg"
		Else
			Return tdriveinfo._trimfloat(nspace / 1073741824.0)+" gig"
		End If
	End Function
	
	Function _trimfloat:String(nfloat:Float,nlength:Int = 2)
		Local temp_pos:Int
		Local temp_string:String = String(nFloat)
		temp_pos = temp_string.find(".")
		If temp_pos > -1 Return temp_string[0..temp_pos+1+nlength]
		Return temp_string
	End Function
	
	Method PercentFree:Float()
		Return (100.0 / totalbytes) * (totalbytes - freebytes)
	End Method
	
	Method PercentUsed:Float()
		Return (100.0 / totalbytes) * availablebytes
	End Method
	
	Method CapacityString:String()
		Return tdriveinfo._bytestospacestring(totalbytes)
	End Method
	
	Method AvailableString:String()
		Return tdriveinfo._bytestospacestring(availablebytes)
	End Method
	
	Method UsedString:String()
		Return tdriveinfo._bytestospacestring(totalbytes - freebytes)
	End Method
	
	Method Capacity:Long()
		Return totalbytes
	End Method
	
	Method Available:Long()
		Return availablebytes
	End Method
	
	Method Used:Long()
		Return totalbytes - freebytes
	End Method
End Type

Function GetAllDrives:TList(nfilter:Int=-1)
	Local temp_list:TList = CreateList()
	Local temp_drives:String
	Local temp_label:String
	Local temp_i:Int
	Local temp_type:Int
	
	'get list of drives
	_GetLogicalDriveStrings(tdriveinfo.buffersize,tdriveinfo.buffer)
	temp_drives = tdriveinfo._getfromstring()
	'read in list of drives
	For temp_i = 0 Until temp_drives.length Step 3
		temp_label = temp_drives[temp_i..temp_i+3]
		
		'create tdriveinfo type
		temp_type = _GetDriveType(tdriveinfo._setcstring(temp_label))
		If nfilter = -1 Or temp_type = nfilter
			'get drive space details
			Local temp_disk:tdriveinfo = New tdriveinfo
			'get space details
			_GetDiskFreeSpaceEx(tdriveinfo._setcstring(temp_label),Varptr(temp_disk.availablebytes),Varptr(temp_disk.totalbytes),Varptr(temp_disk.freebytes))
			'set other details
			temp_disk.label = temp_label.tolower()
			temp_disk.drivetype = temp_type
			
			temp_list.addlast(temp_disk)
		End If
	Next
	
	Return temp_list
End Function

Function GetCDDrives:TList()
	Return GetAllDrives(DRIVE_CDROM)
End Function

Function GetHardDrives:TList()
	Return GetAllDrives(DRIVE_FIXED)
End Function

Function GetRamDrives:TList()
	Return GetAllDrives(DRIVE_RAMDISK)
End Function

Function GetRemoveableDrives:TList()
	Return GetAllDrives(DRIVE_REMOVABLE)
End Function

Function GetNetworkDrives:TList()
	Return GetAllDrives(DRIVE_REMOTE)
End Function

Comments

xlsior2009
Nice!

There's a math error in your sample, though:

You are returning the space FREE and the total space, and using it to calculate the total % used.

For example, on my computer it returns this (among others)

(z:\) :: 9.67 gig / 405.67 gig (2.38394117% used)



I have 9.67 GB free on a 405.67GB partition, and the drive is therefore actually 97.6% full instead of 2.4%.


Code Archives Forum