Hey Guys, I am trying to create this application which can display the free space and the total space of logical drives,,I am very close but there is some little mistake which I am not being able to find out..Please help,,here is the code

Public Class Form2

    Private strDrive As String = ""
    Private lngFreeSpace As Double = 0
    Private lngTotalSpace As Double = 0
    
   
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

        FindDrives()
        ComboBox2.SelectedIndex = 0
        strDrive = ComboBox1.Text.Substring(0, 2)
        'DriveInfoSystem info=DriveInfo.GetInfo(strDrive);
        Dim info As DriveInfoSystem = DriveInfo.GetInfo("C:\Program Files")
        lngFreeSpace = Convert.ToDouble(info.Available)
        lngTotalSpace = Convert.ToDouble(info.Total)
        Label5.Text = lngFreeSpace.ToString()
        Label6.Text = lngTotalSpace.ToString()
    End Sub
    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
        Conversion()
    End Sub

    Private Sub ComboBox2_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectionChangeCommitted
        Conversion()
    End Sub
    Private Sub Conversion()
        strDrive = ComboBox1.Text.Substring(0, 2)
        Dim info As DriveInfoSystem = DriveInfo.GetInfo(strDrive)
        lngFreeSpace = Convert.ToDouble(info.Available)
        lngTotalSpace = Convert.ToDouble(info.Total)

        Dim intIndex As Integer = ComboBox2.SelectedIndex

        Select Case intIndex

            Case 1
                lngFreeSpace = lngFreeSpace / 1024
                lngTotalSpace = lngTotalSpace / 1024
                Exit Select
            Case 2
                lngFreeSpace = (lngFreeSpace / 1024) / 1024
                lngTotalSpace = (lngTotalSpace / 1024) / 1024
                Exit Select
            Case 3
                lngFreeSpace = ((lngFreeSpace / 1024) / 1024) / 1024
                lngTotalSpace = ((lngTotalSpace / 1024) / 1024) / 1024
                Exit Select
            Case 4
                lngFreeSpace = (((lngFreeSpace / 1024) / 1024) / 1024) / 1024
                lngTotalSpace = (((lngTotalSpace / 1024) / 1024) / 1024) / 1024
                Exit Select
        End Select

        Label5.Text = lngFreeSpace.ToString()
        Label6.Text = lngTotalSpace.ToString()
    End Sub
    Private Sub FindDrives()
        Dim tempString As String() = Directory.GetLogicalDrives()
        For Each tempDrive As String In tempString
            ComboBox1.Items.Add(tempDrive)
        Next
        ComboBox1.SelectedIndex = 0
    End Sub
    Public Structure DriveInfoSystem
        Public ReadOnly Drive As String
        Public ReadOnly Result As Long
        Public ReadOnly Available As Long
        Public ReadOnly Total As Long
        Public ReadOnly Free As Long

        Public Sub New(ByVal drive As String, ByVal result As Long, ByVal available As Long, ByVal total As Long, ByVal free As Long)
            Me.Drive = drive
            Me.Result = result
            Me.Available = available
            Me.Total = total
            Me.Free = free
        End Sub
    End Structure
    Public NotInheritable Class DriveInfo
        Private Drive As String
        Private Result As Long
        Private Available As Long
        Private Total As Long
        Private Free As Long
        Public Sub New(ByVal drive As String, ByVal result As Long, ByVal available As Long, ByVal total As Long, ByVal free As Long)
            Me.Drive = drive
            Me.Result = result
            Me.Available = available
            Me.Total = total
            Me.Free = free
        End Sub
       
        <DllImport("kernel32.dll", EntryPoint:="GetDiskFreeSpaceExA")> _
        Private Shared Function GetDiskFreeSpaceEx(ByVal lpDirectoryName As String, ByRef lpFreeBytesAvailableToCaller As Long, ByRef lpTotalNumberOfBytes As Long, ByRef lpTotalNumberOfFreeBytes As Long) As Long
        End Function

        Public Shared Function GetInfo(ByVal drive As String, ByRef available As Long, ByRef total As Long, ByRef free As Long) As Long
            Return GetDiskFreeSpaceEx(drive, available, total, free)
        End Function


        Public Shared Function GetInfo(ByVal drive As String) As DriveInfoSystem
            Dim result As Long, available As Long, total As Long, free As Long
            result = GetDiskFreeSpaceEx(drive, available, total, free)
            Return New DriveInfoSystem(drive, result, available, total, free)
        End Function
    End Class

End Class

It would really help if you told us what you were missing.

By the way, it is not necessary to have "End Select" in every case clause. Only one of the case clauses will ever be executed.

Edited 4 Years Ago by Reverend Jim: n/a

I am not able to retrieve the drives..i guess something wrong with the driveinfo class..I will be thankful for any concerned help..

I'm using VB 2010 and the following console app on my computer:

Module Module1

    Sub Main()

        For Each drive As String In System.Environment.GetLogicalDrives()

            Try

                Dim info As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo(drive)

                Console.WriteLine()
                Console.WriteLine("Name               " & info.Name.ToString)
                Console.WriteLine("VolumeLabel        " & info.VolumeLabel.ToString)
                Console.WriteLine("DriveType          " & info.DriveType.ToString)
                Console.WriteLine("DriveFormat        " & info.DriveFormat.ToString)
                Console.WriteLine("AvailableFreeSpace " & info.AvailableFreeSpace.ToString)
                Console.WriteLine("RootDirectory      " & info.RootDirectory.ToString)
                Console.WriteLine("TotalFreeSpace     " & info.TotalFreeSpace.ToString)
                Console.WriteLine("TotalSize          " & info.TotalSize.ToString)

            Catch e As System.IO.IOException

                Console.WriteLine()
                Console.WriteLine("Drive " & drive & " not available")

            End Try

        Next

    End Sub

End Module

Generates the following:

Name               C:\
VolumeLabel        C-OS
DriveType          Fixed
DriveFormat        NTFS
AvailableFreeSpace 7191638016
RootDirectory      C:\
TotalFreeSpace     7191638016
TotalSize          42443206656

Name               D:\
VolumeLabel        D-DATA
DriveType          Fixed
DriveFormat        NTFS
AvailableFreeSpace 42670780416
RootDirectory      D:\
TotalFreeSpace     42670780416
TotalSize          205294755840

Name               E:\
VolumeLabel        E-DATA
DriveType          Fixed
DriveFormat        NTFS
AvailableFreeSpace 62134550528
RootDirectory      E:\
TotalFreeSpace     62134550528
TotalSize          250056704000

Name               F:\
VolumeLabel        Roxio Creator DE
DriveType          CDRom
DriveFormat        CDFS
AvailableFreeSpace 0
RootDirectory      F:\
TotalFreeSpace     0
TotalSize          146671616

Name               W:\

Drive W:\ not available

Note that I am using slightly different system calls than you are. Try my code on your machine and tell me what you get.

thanks for the replies...but now i have recoded it and everything's good about it,still i am not getting the desired output ,,most importantly not getting the drives listed.Here's the code:

Public Class Form2

    Private strDrive As String = ""
    Private lngFreeSpace As Double = 0
    Private lngTotalSpace As Double = 0
    
   
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

        FindDrives()
        ComboBox2.SelectedIndex = 0
        strDrive = ComboBox1.Text.Substring(0, 2)
        'DriveInfoSystem info=DriveInfo.GetInfo(strDrive);
        Dim info As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo(strDrive)

        lngFreeSpace = Convert.ToDouble(info.AvailableFreeSpace)
        lngTotalSpace = Convert.ToDouble(info.TotalFreeSpace)
        Label5.Text = lngFreeSpace.ToString()
        Label6.Text = lngTotalSpace.ToString()
    End Sub
    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted
        Conversion()
    End Sub

    Private Sub ComboBox2_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectionChangeCommitted
        Conversion()
    End Sub
    Private Sub Conversion()
        strDrive = ComboBox1.Text.Substring(0, 2)
        Dim info As System.IO.DriveInfo = My.Computer.FileSystem.GetDriveInfo(strDrive)
        lngFreeSpace = Convert.ToDouble(info.AvailableFreeSpace)
        lngTotalSpace = Convert.ToDouble(info.TotalFreeSpace)

        Dim intIndex As Integer = ComboBox2.SelectedIndex

        Select Case intIndex

            Case 1
                lngFreeSpace = lngFreeSpace / 1024
                lngTotalSpace = lngTotalSpace / 1024
                Exit Select
            Case 2
                lngFreeSpace = (lngFreeSpace / 1024) / 1024
                lngTotalSpace = (lngTotalSpace / 1024) / 1024
                Exit Select
            Case 3
                lngFreeSpace = ((lngFreeSpace / 1024) / 1024) / 1024
                lngTotalSpace = ((lngTotalSpace / 1024) / 1024) / 1024
                Exit Select
            Case 4
                lngFreeSpace = (((lngFreeSpace / 1024) / 1024) / 1024) / 1024
                lngTotalSpace = (((lngTotalSpace / 1024) / 1024) / 1024) / 1024
                Exit Select
        End Select

        Label5.Text = lngFreeSpace.ToString()
        Label6.Text = lngTotalSpace.ToString()
    End Sub
    Private Sub FindDrives()
        For Each drive As String In System.Environment.GetLogicalDrives()
            
            ComboBox1.Items.Add(drive)
            Next
            ComboBox1.SelectedIndex = 0
    End Sub
End Class

Try using the event SelectedValueChanged instead of SelectionChangeCommitted for the combobox. And I'll remind you, you don't need an "Exit Select" in your case clauses.

What results are you getting? Saying "it doesn't work" doesn't really help me narrow it down. There are 1001 way for it not to work.

It is just reading the root directory or the C drive...I want to read the logical and the mounted drives too.

My sample DID enumerate all drives. My drive F is a Virtual Clone (mounted) drive. To enumerate drives, it doesn't make sense to go below the root directory.

Actually I want my program to just read the mounted drive...help me with that please ..

Edited 4 Years Ago by bigzos: n/a

My code does that. What exactly do you mean by a mounted drive? Is this different from my mounted iso in my example? How are you mounting it?

Basically like a subst. You can't get the size of a logical drive such as that because the numbers wouldn't make sense. Free space on a drive only makes sense when the drive is physical. Let's say you have a drive letter (M:) mapped to

D:\Temp\My Folder\subdir\temp\settings

What does "free space" on M really mean when M is not really a drive? The only number that makes sense is the free space on D:.

I just checked further and I see I was mistaken about the mounting. As I understand it, you have a physical drive (or partition) mounted as a folder in an existing drive. May I ask why you chose to access the drive that way rather than assigning it a drive letter?

Actually,I am given a task of reading a logical drive on a server which i cannot realise on my laptop..So i was just trying to draw a parallel this way

This article has been dead for over six months. Start a new discussion instead.