Search code examples
c#usb

Not able to detect Hard disk drive in C# application


I have written an api to get all external storage drives connected to my computer. But i am not able to detect hard disk drives.

private async Task GetAllDrivesConnected()
        {
                await Task.Run(() =>
                {
                    var drives = DriveInfo.GetDrives();
                    lock (this.myUsbDriveListLock)
                    {
                        foreach (var aDrive in drives .Where(theDrive => theDrive.DriveType == DriveType.Removable && theDrive.IsReady))
                        {
                            DriveLetter_Array.Add(aDrive.Name);
                        }
                    }

                    string LatestPath = DriveLetter_Array.LastOrDefault();
                    this.SetCurrentUsbPath(LatestPath);
                    var DeviceMessageEventArgs = new DeviceMessageEventArgs { Drive = LatestPath, UsbAdded = true };
                    FireEventAddPathRemovePath(DeviceMessageEventArgs);
                });
            
        }

I am making use of WML queries to listen to device inserted event:

 private async Task DeviceNotification()
        {
            await Task.Run(() =>
            {
                var InsertQuery = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2");
                myInsertionWatcher = new ManagementEventWatcher(InsertQuery);
                myInsertionWatcher.EventArrived += this.DeviceInsertedEvent;
                myInsertionWatcher.Start();

                var RemoveQuery = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 3");
                myRemovalWatcher = new ManagementEventWatcher(RemoveQuery);
                myRemovalWatcher.EventArrived += this.DeviceRemovedEvent;
                myRemovalWatcher.Start();
            });
        }

Solution

  • It's not clear from your comment if you actually checked for other DriveTypes. If I run the following after having connected an external hard drive I get the output from the image:

    DriveInfo.GetDrives().Where(d => d.IsReady)
    

    enter image description here

    As you can see it has DriveType Fixed, even if it's connected through a USB port.

    You may want to change your foreach loop:

    foreach (var aDrive in drives .Where(theDrive => theDrive.IsReady))
    {
        DriveLetter_Array.Add(aDrive.Name);
    }
    

    If you want to only see external hard drives, you may want to take a look at this answer