最近测试组小伙伴在用外接扩展坞链接有线网络,发现好几个程序在获取磁盘信息的时候都直接报错。这让我很奇怪,拉取了现场的日志。

由于这个模块的代码已经很稳定,好久没修改过了,之前一直测试都没有问题的,然后查看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 进行捕获

C# 获取磁盘或硬盘信息的坑,存在未就绪(IsReady = false)导致异常的问题的更多相关文章

  1. C#获取磁盘列表与信息

    方法1:使用Environment //获取当前计算机逻辑磁盘名称列表 String[] drives = Environment.GetLogicalDrives(); Console.WriteL ...

  2. Powershell获取磁盘信息

    使用Powershell完成系统管理实在是太方便了,磁盘信息获取只需几行代码即可. 1: $DiskCount = ((Get-WmiObject -Class Win32_DiskDrive).Ca ...

  3. Java如何获取系统cpu、内存、硬盘信息

    1 概述 前段时间摸索在Java中怎么获取系统信息包括cpu.内存.硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插 ...

  4. 主机性能监控之wmi 获取磁盘信息

    标 题: 主机性能监控之wmi 获取磁盘信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990541.html 欢迎转帖 请保持文本完整并注明出处 仅 ...

  5. 通过kfed自动获取磁盘信息的小脚本

    通过kfed自动获取磁盘信息的小脚本 编译KFED [oracle@rac lib]$cd $ORACLE_HOME/rdbms/lib [oracle@rac lib]$ pwd /u01/app/ ...

  6. 一键获取linux内存、cpu、磁盘IO等信息脚本编写,及其原理详解

    更多linux知识,请关注公众号:一口Linux 一.脚本 今天主要分享一个shell脚本,用来获取linux系统CPU.内存.磁盘IO等信息. #!/bin/bash # 获取要监控的本地服务器IP ...

  7. C#-获取磁盘,cpu,内存信息

    获取磁盘信息 zongdaxiao = GetHardDiskSpace("C") * 1.0 / 1024; user = GetHardDiskFreeSpace(" ...

  8. C#获取当前主机硬件信息

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. C#利用WMI获取 远程计算机硬盘数据

    一.利用WMI获取 远程计算机硬盘数据,先引入"System.Management.dll"文件. /// <summary>        /// 获取存储服务器硬盘 ...

  10. C/C++获取CPU等硬件信息&&屏幕截图

    打算练习Socket的时候用用,最近有点小事情,没时间继续完善,先把写的这些代码贴上来,有空了再完善一下. HardwareInfo.h #include <stdio.h> #inclu ...

随机推荐

  1. mysql : 第5章 数据库的安全性

    -- 创建用户CREATE USER utest@localhost IDENTIFIED BY 'temp';-- 查看所有用户SELECT * FROM mysql.user;-- 查看表级权限S ...

  2. 扩展知识:vscode配置easyx

    扩展知识:vscode配置easyx 前言 ‍ 因为个人用习惯了vscode,对于visual studio的操作只能说相当程度上很不适应,因此,我打算经历一番配置,让vscode可以配置上easyx ...

  3. Oracle 给用户赋予dblink权限,创建dblink

    1.判断用户是否具备创建database link 的权限 一:查看当前登录用户(如果查询有返回行,则表示具备创建权限,否则,需要创建权限) 1 select * from user_sys_priv ...

  4. 初始化参数之memory_target

    一.引言: Oracle 9i引入pga_aggregate_target,可以自动对PGA进行调整: Oracle 10g引入sga_target,可以自动对SGA进行调整: Oracle 11g则 ...

  5. 在Unity中实现(纯C#)热更新--使用ILRunTime{学习日志}

    热更新的逻辑:热更新的那部分内容其实就是一个dll的库文件,到时候修改也是改这个库文件: 我们只需要在主工程(我们的Unity项目)中引入并调用这个dll库里的代码就行了. 首先我们需要在Unity中 ...

  6. 【uniapp】文本控件多余文字省略号代替

    多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...

  7. Nginx 查看配置文件路径

    通过测试信息来间接查看 #测试nginx.conf是否正确 nginx -t #输入此命令,通常会输出如下信息 nginx: the configuration file /etc/nginx/ngi ...

  8. 正在开发的.net sql拼写神器

    我正在开发的一个.net sql拼写工具,当然也可以算是ORM 该工具的作用就是帮忙码农拼写sql,对标开源项目SqlKata.该工具最适合搭配Dapper使用,所以附带了一个Dapper扩展.当然直 ...

  9. Armbian安装防火墙软件

    在Armbian操作系统中安装防火墙是一项提升系统安全性的重要步骤.Armbian是一个针对ARM架构设备的Debian Linux发行版,它广泛应用于各类ARM开发板和单板计算机上.下面将具体展开讲 ...

  10. SpringBoot 部署:外置依赖包

    目录: 1.前言 2.瘦身前的Jar包 3.解决方案 一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编 ...