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 进行捕获

posted @ 2024-09-14 09:28  wuty007  阅读(53)  评论(0编辑  收藏  举报