I use the following code to get logical drives:
string[] strDrives = Environment.GetLogicalDrives();
but when I want to iterate through it, an exception occurs, with the message:
Drive Not Ready
How can I get just ready drives?
On
I would do the following:
string[] drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady)
.Select(drive => drive.Name)
.ToArray();
DriveInfo provides a static GetDrives method, which returns an array of DriveInfo (DriveInfo[]) instances, representing information about each drive.
The IsReady property of each instance returns a boolean value indicating whether the drive can be read from or written to.
Drives which are not 'ready' throw exceptions when used, and rightly so: you cannot perform any operations on a drive which is not ready, so the best approach would be to throw an exception if someone did so, informing them of their mistake.
In the above code, I use LINQ's Where extension to iterate through the drives and discard the ones which are not ready.
Next, in the Select method of the same nature, I retrieve each drive's Name property, which represents the drive letter, such as C:\ or D:\.
Finally, I call the ToArray method on the returned IEnumerable, which copies all of the elements in the enumerable into an array. I assume that you want the drive letters as an array.
Use DriveInfo to determine if the drive is ready.