C# 获取磁盘或硬盘信息的坑,存在未就绪(IsReady = false)导致异常的问题
最近测试组小伙伴在用外接扩展坞链接有线网络,发现好几个程序在获取磁盘信息的时候都直接报错。这让我很奇怪,拉取了现场的日志。
由于这个模块的代码已经很稳定,好久没修改过了,之前一直测试都没有问题的,然后查看windows 的盘符发现,只要插上扩展坞就会无缘无故多出来这种虚拟盘,无法点击,属性几乎是空的
在现场测试发现,只要拔掉扩展坞,异常的程序就能恢复正常了。
回去查看了一下代码,就是遍历所有盘符,获取是U盘,并且名称是UPGRADEDISK的U盘, 发现之前的代码片段如下:
该代码片段其实并没有判断某个盘是否已经准备就绪,详看:DriveInfo.IsReady 属性 (System.IO) | Microsoft Learn
如果在IsReady = false 的情况下,去获取磁盘的信息,可能就会出发Io异常了
下面是把触发了异常的代码段修改为正常的写法,增加了 优先 IsReady = true 的判断,再去获取磁盘的信息,测试没问题了
var driverInfos = DriveInfo.GetDrives().ToList().FindAll(x => x.IsReady && x.DriveType == DriveType.Removable && x.VolumeLabel.Equals("UPGRIDEDISK", StringComparison.OrdinalIgnoreCase));
总结:
1、如果用到DriveInfo.GetDrives() 去获取 磁盘的信息的时候,最保险的做法是:需要优先判断 IsReady 的属性,再去 获取磁盘信息
2、对于执行IO读写的操作,最好还是加上try-catch 进行捕获