VB.NET – Detecting when a USB drive is connected and getting the drive letter

November 10, 2009 — 2 Comments

The example code below will detect when a USB drive is connected and will then look for a file named test.txt in the USB drive.

You can also see this code if you look at my post on vbforums here (see the later posts for some corrections to the code in the original post on the forum): http://www.vbforums.com/showthread.php?t=534956

Imports System.Runtime.InteropServices

Public Class Form1

    Private Const WM_DEVICECHANGE As Integer = &H219
    Private Const DBT_DEVICEARRIVAL As Integer = &H8000
    Private Const DBT_DEVTYP_VOLUME As Integer = &H2

    'Device information structure
    Public Structure DEV_BROADCAST_HDR
        Public dbch_size As Int32
        Public dbch_devicetype As Int32
        Public dbch_reserved As Int32
    End Structure

    'Volume information Structure
    Private Structure DEV_BROADCAST_VOLUME
        Public dbcv_size As Int32
        Public dbcv_devicetype As Int32
        Public dbcv_reserved As Int32
        Public dbcv_unitmask As Int32
        Public dbcv_flags As Int16
    End Structure

    'Function that gets the drive letter from the unit mask
    Private Function GetDriveLetterFromMask(ByRef Unit As Int32) As Char
        For i As Integer = 0 To 25
            If Unit = (2 ^ i) Then
                Return Chr(Asc("A") + i)
            End If
        Next
    End Function

    'Override message processing to check for the DEVICECHANGE message
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = WM_DEVICECHANGE Then
            If CInt(m.WParam) = DBT_DEVICEARRIVAL Then
                Dim DeviceInfo As DEV_BROADCAST_HDR
                DeviceInfo = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_HDR)), DEV_BROADCAST_HDR)
                If DeviceInfo.dbch_devicetype = DBT_DEVTYP_VOLUME Then
                    Dim Volume As DEV_BROADCAST_VOLUME
                    Volume = DirectCast(Marshal.PtrToStructure(m.LParam, GetType(DEV_BROADCAST_VOLUME)), DEV_BROADCAST_VOLUME)
                    Dim DriveLetter As String = (GetDriveLetterFromMask(Volume.dbcv_unitmask) & ":\")
                    If IO.File.Exists(IO.Path.Combine(DriveLetter, "test.txt")) Then
                        '<<<< The test file has been found >>>>
                        MessageBox.Show("Found test file")
                    Else
                        '<<<< Test file has not been found >>>>
                        MessageBox.Show("Could not find test file")
                    End If
                End If
            End If
        End If
        'Process all other messages as normal
        MyBase.WndProc(m)
    End Sub

End Class

2 responses to VB.NET – Detecting when a USB drive is connected and getting the drive letter

  1. 

    Thank for sharing this …. i found this so long…. i will bookmark it for future come back…

Leave a comment