我使用以下代码获取逻辑驱动器:
string[] strDrives = Environment.GetLogicalDrives();
但是当我想遍历它时,会发生异常,并显示以下消息:
Drive Not Ready
我怎样才能得到刚刚准备好的驱动器?
使用 DriveInfo 确定驱动器是否准备就绪。
foreach (var oneDrive in strDrives)
{
var drive = new DriveInfo(oneDrive)
if (drive.IsReady)
{
// Do something with the drive...
}
}
当然,这也可以使用 Linq 来实现:
IEnumerable<DriveInfo> readyDrives = Environment.GetLogicalDrives()
.Select(s => new DriveInfo(s))
.Where(di => di.IsReady);
我会做以下事情:
string[] drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady)
.Select(drive => drive.Name)
.ToArray();
DriveInfo
提供了一个静态方法,它返回一个( ) 实例GetDrives
数组,表示每个驱动器的信息。DriveInfo
DriveInfo[]
每个实例的IsReady
属性返回一个布尔值,指示是否可以读取或写入驱动器。
未“准备好”的驱动器在使用时会抛出异常,这是正确的:您不能对未准备好的驱动器执行任何操作,因此最好的方法是在有人这样做时抛出异常,并告知他们他们的错误。
在上面的代码中,我使用 LINQ 的Where
扩展来遍历驱动器并丢弃未准备好的驱动器。
接下来,在Select
相同性质的方法中,我检索每个驱动器的Name
属性,它表示驱动器号,例如C:\
或D:\
。
最后,我调用ToArray
返回的方法IEnumerable
,它将枚举中的所有元素复制到一个数组中。我假设您希望将驱动器号作为一个数组。